正则表达式 – 在Perl中使用*修饰符进行负前瞻性断言

我有(我相信的)负面预测断言< @>如果测试的字符串是< @>,我希望匹配的*(?!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

而且我预计第一行会是< @> QQQ – >在QQQ上的东西.

它匹配,因为零包含在“任何数字”中.因此,没有空格,后跟空格,匹配“任何数量的空格后面没有Q”.

你应该添加另一个先行断言,即你的空格之后的第一件事本身就不是空间.试试这个(未经测试):

 <@> *(?!QQQ)(?! )

ETA旁注:只有当只有一个空格时,才能将量词更改为有用;在一般情况下,正则表达式总是可以占用更少的空间,因此成功.正则表达式想要匹配,并且会以任何可能的方式向后弯曲.所有其他考虑因素(最左边,最长等)都退居二线 – 如果它可以匹配多种方式,它们会决定选择哪种方式.但匹配总是胜过不匹配.

转载注明原文:正则表达式 – 在Perl中使用*修饰符进行负前瞻性断言 - 代码日志