regex - Perl 中带有 * 修饰符的否定前瞻断言

标签 regex perl negative-lookahead regex-lookarounds

我有(我认为是)负面的前瞻断言 <@> *(?!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/

相关文章:

javascript - 我需要一个正则表达式来匹配字符串

regex - Linux 将多个文本文件解析成单独的文件

php - 如何添加对小数点前 3 位正 float 的验证?

Java 正则表达式 : Negative lookahead

regex - 谷歌分析漏斗中的否定匹配(用于 shopify 商店)

javascript - 用JS替换网页中的文字

bash - dc(桌面计算器)- 哈希类型

perl - 无法使用perl中的引用内部函数打印值

perl - 如何在 Perl 中创建枚举类型?

c# - 惰性量词和前瞻