我有(我认为是)负面的前瞻断言 <@> *(?!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)(?! )
预计到达时间 旁注:仅当只有一个空格时,将量词更改为 + 才有帮助;在一般情况下,正则表达式总是可以少占用一个空间并因此成功。正则表达式想要匹配,并且会以任何可能的方式向后弯曲。所有其他考虑因素(最左边、最长等)都退居次要位置 - 如果它可以匹配多个方式,则它们决定选择哪种方式。但匹配总是胜过不匹配。
关于regex - Perl 中带有 * 修饰符的否定前瞻断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350053/