Perl Regex"不"(负向前瞻)

Gol*_*wby 25 regex perl regex-lookarounds

我并不十分确定这种类型的正则表达式的正确措辞是什么,但基本上我要做的是匹配任何以"/"开头但后面没有"bob /"的字符串,作为示例.

所以这些匹配:

/tom/
/tim/
/steve
Run Code Online (Sandbox Code Playgroud)

但这些不会

tom
tim
/bob/
Run Code Online (Sandbox Code Playgroud)

我确定答案非常简单,但我很难在任何地方寻找"正则表达式".我确信有一个更好的词,我想要什么会带来好结果,但我不确定它会是什么.

编辑:我已经更改了标题,以指出我正在寻找的正确名称

ano*_*ard 24

您可以使用负前瞻(在perlre中的"扩展模式"下记录):

/^\/(?!bob\/)/
Run Code Online (Sandbox Code Playgroud)

  • @brian d foy,建议存在这个特性意味着`/ ^ /`必须改为`/\A /`,`/ $ /`到`/(?= \n?\ z)/`是荒谬的. ,`/./`到`/ [^ \n] /`和`/ /`到`/ [] /`. (8认同)
  • 或者,更具可读性:`m {^ /(?!bob /)}` (6认同)
  • 现在默认的正则表达式标志是一个特性,`^`最好写成`\ A`.使用备用分隔符和`/ x`,它看起来像`m |\A /(?!bob /)| x`. (2认同)

Hol*_*ger 8

TLDR:负向前瞻

\n

如果您想要一个否定的前瞻,只是为了找到"foo"它后面没有跟随的时间"bar"...

\n
$string =~ m/foo(?!bar)/g;\n
Run Code Online (Sandbox Code Playgroud)\n

在线工作演示

\n

来源

\n

引用文档...

\n
\n

(?!pattern)

\n

(*nla:pattern)

\n

#(*negative_lookahead:pattern)

\n

零宽度负前瞻断言。例如,/foo(?!bar)/匹配任何后面不跟“bar”的“foo”。但请注意,前视和后视不是同一件事。您不能将其用于向后查找。(来源:PerlDocs。)

\n
\n

对您的案例进行负面预测

\n

接受的答案很好,但没有留下任何解释,所以让我添加一个......

\n
/^\\/(?!bob\\/)/\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • ^\xe2\x80\x94 仅匹配字符串的开头。
  • \n
  • \\/\xe2\x80\x94 匹配/char,我们需要对其进行转义,因为它是正则表达式格式的字符(即s/find/replacewith/等)。
  • \n
  • (?!...)\xe2\x80\x94 如果匹配后跟 则不匹配...
  • \n
  • bob\\/\xe2\x80\x94 这是...值,不匹配bob/\', once more, we need to escape the /`。
  • \n
\n