如果测试的字符串是<@> *(?!QQQ)
后跟任意数量的空格(包括零),然后不跟<@>
,则我希望匹配(我相信是)否定的前瞻性断言QQQ
。
但是,如果测试的字符串是<@> QQQ
,则正则表达式匹配。
我不明白为什么会这样,并希望在此问题上有所帮助。
这是一个测试脚本
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;
}
此打印
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
我本来希望第一行是
something <@> QQQ --> something at w/ QQQ
。 最佳答案
之所以匹配,是因为“任何数字”中都包含零。因此,没有空格,后跟一个空格,会匹配“任何数量的后跟一个Q的空格”。
您应该添加另一个前瞻性断言,即空格之后的第一件事本身并不是空格。试试这个(未试用):
<@> *(?!QQQ)(?! )
ETA 补充说明:仅在只有一个空格的情况下,将量词更改为+才有帮助;在一般情况下,正则表达式总是可以少占用一个空间,因此可以成功。正则表达式想要匹配,并且会以任何可能的方式向后弯曲。所有其他考虑因素(最左侧,最长等)都应放在后座上-如果它可以匹配多种方式,则可以确定选择哪种方式。但是匹配总是胜过不匹配。