Ich habe das (was ich glaube zu sein) negativ vorwärtsgerichtete Behauptung<@> *(?!QQQ)
, dass ich passend zu erwarten, wenn die getestete Zeichenfolge ein <@>
durch eine beliebige Anzahl von Räumen (Null einschließlich) gefolgt ist und dann nicht gefolgt von QQQ
.Negativ vorwärtsgerichtete Behauptung mit dem * Modifikator in Perl
Wenn jedoch die getestete Zeichenfolge <@> QQQ
ist, stimmt der reguläre Ausdruck überein.
Ich verstehe nicht, warum dies der Fall ist, und würde jede Hilfe in dieser Angelegenheit schätzen.
Hier ist ein Testskript
use warnings;
use strict;
my @strings = ('something <@> QQQ',
'something <@> RRR',
'something <@>QQQ' ,
'something <@>RRR');
print "$_\n" for map {$_ . " --> " . rep($_) } (@strings);
sub rep {
my $string = shift;
$string =~ s,<@> *(?!QQQ),at w/o ,;
$string =~ s,<@> *QQQ,at w/ QQQ,;
return $string;
}
Dieser druckt
something <@> QQQ --> something at w/o QQQ
something <@> RRR --> something at w/o RRR
something <@>QQQ --> something at w/ QQQ
something <@>RRR --> something at w/o RRR
Und ich würde die erste Zeile something <@> QQQ --> something at w/ QQQ
zu erwarten haben.
'(? = \ S)' sollte sein '(? = [^])' (Falls das nächste Zeichen ein Tab ist). Eigentlich sollte es '(?!)' Sein (falls es das Ende der Zeichenkette ist). – ikegami
Danke für den Fang und Bearbeiten, @ikegami. –