/( (?: \w+ (?:\s+\w+ )? )? ; (?: \w+ (?: \s+\w+ )? )? ) /x;
1 2 3 4 5 6 7 8 9 10 11 12
/ ( ( \w+ (?:\s+\w+)? )? ; ( \w+ (?:\s+\w+)? )? ) (?(2) | (?(3) | (?!))) /x
1 2 3 4 5 6 7 8
$k='(\s+\w+ )'; $re=qr#(?:$k;$k|;$k|$k;)#; $\="\n"; print " AAA ;" =~ $re; print " BBB ; CCC ;" =~ $re; print " ; DDD " =~ $re;
/( (?: \w+ (?:\s+\w+ )? )?+ ; (?: \w+ (?: \s+\w+ )? )?+ /x;
1
2
3
4
~$ perl
$rx = qr/( (?: \w+ (?:\s+\w+ )? )?+ ; (?: \w+ (?: \s+\w+ )? )?+ )/x;
print "gaga\n" if ';' =~ $rx;
gaga
QuoteDas + hinter dem Fragezeichen bedeutet doch nur, dass nicht versucht wird, den optionalen Ausdruck, wenn er denn passte, wieder freizugeben, damit der gesamte Ausdruck matcht, oder?
Also ein /\w?b/ würde auf 'b' matchen, ein /\w?+b/ jedoch nicht.
1 2 3 4 5 6 7 8 9 10 11
DB<1> $t='\w' DB<2> if ( "aaa ; " =~ /($t)?( ; )($t)?/ and "$1$3" ne "") { print "$1$2$3"} aaa ; DB<3> if ( "aaa ; bbb" =~ /($t)?( ; )($t)?/ and "$1$3" ne "") { print "$1$2$3"} aaa ; bbb DB<4> if ( " ; bbb" =~ /($t)?( ; )($t)?/ and "$1$3" ne "") { print "$1$2$3"} ; bbb DB<5> if ( " ; " =~ /($t)?( ; )($t)?/ and "$1$3" ne "") { print "$1$2$3"} DB<6>