如果测试的字符串是<@> *(?!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 补充说明:仅在只有一个空格的情况下,将量词更改为+才有帮助;在一般情况下,正则表达式总是可以少占用一个空间,因此可以成功。正则表达式想要匹配,并且会以任何可能的方式向后弯曲。所有其他考虑因素(最左侧,最长等)都应放在后座上-如果它可以匹配多种方式,则可以确定选择哪种方式。但是匹配总是胜过不匹配。

10-06 07:22