2017-10-20 1 views
0

Ich bin ein Perl noob und ich habe versucht, ein einfaches Skript zu entwickeln, um einige Werte aus einer Regex zu erfassen. Bisher habe ich folgendes Programm aufgebaut:Fehler in Perl: Verschachtelte Quantifizierer in Regex

#!/usr/bin/perl 

use strict; 
$/ = ''; 

my $PM = qr{\b[A-Z][\w-]*\w}; 
my $de = qr{d[aoe]s?}; 
my $s = qr{[\n ]}; 
my $np = qr{$PM (?: $s $PM | $s $de $s $PM)*}x; 

my $window_size = 7; 
my $window = qr{($np) (?: $s+ (\w+))*}; 

while(<>){ 
    while(/($np) (?: $s+ (?: [\w-]+ | ($np))) ** {0..$window_size} /xg){ 
     print("\$1: $1 and \$2: $2 \n"); 
    } 
} 

Allerdings, wenn ich versuche, diesen Code auszuführen, es zeigt mir folgende Fehlermeldung:

Nested quantifiers in regex; marked by <-- HERE in m/((?^ux:(?^u:\b[A-Z][\w-]*\w) (?: (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w) | (?^u:[\n ]) (?^u:d[aoe]s?) (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w))*)) (?: (?^u:[\n ])+ (?: [\w-]+ | ((?^ux:(?^u:\b[A-Z][\w-]*\w) (?: (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w) | (?^u:[\n ]) (?^u:d[aoe]s?) (?^u:[\n ]) (?^u:\b[A-Z][\w-]*\w))*)))) ** <-- HERE {0..7}/at ./main.pl line 22, <> chunk 1. 

Warum ist das nicht?

EDIT: Ich versuche, den Operator ** als den allgemeinen Quantifizierer zu verwenden, gefolgt von einem Bereich. Ich habe gelesen, dass es entspricht {Bereich min, Bereich max} Quantifizierer

+4

Was willst du '**' hier bedeuten? –

+1

Was ist die Zeichenfolge, die Sie abgleichen möchten? – Barmar

+2

Sie scheinen Perl und Perl6 zu verwirren. '** {0..7}' sieht aus wie etwas, was Perl6-Grammatiken tun würden. – melpomene

Antwort

0

Wenn Sie nichts anderes als die literale Zeichenfolge mit "**" übereinstimmen, dann müssen Sie es zu entkommen.

/($np) (?: $s+ (?: [\w-]+ | ($np))) \*\* {0..$window_size}/