Perl Regex“不”(负向前瞻)

时间:2012-04-04 00:12:31

标签: regex perl regex-lookarounds

我并不十分确定这种正则表达式的正确措辞是什么,但基本上我要做的是匹配任何以“/”开头但后面没有“bob /”的字符串,举个例子。

所以这些匹配:

/tom/
/tim/
/steve

但这些不会

tom
tim
/bob/

我确信答案非常简单,但我很难在任何地方搜索“正则表达式”。我确信有一个更好的词来说明我想要什么会带来好结果,但我不确定它会是什么。

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

2 个答案:

答案 0 :(得分:21)

您可以使用否定前瞻(记录在"Extended Patterns" in perlre下):

/^\/(?!bob\/)/

答案 1 :(得分:0)

TLDR:负面预测

如果您想要负前瞻只是为了在后面没有 "foo" 的情况下找到 "bar"...

$string =~ m/foo(?!bar)/g;

functional updates

来源

引用文档...

<块引用>

(?!pattern)

(*nla:pattern)

#(*negative_lookahead:pattern)

零宽度负前瞻断言。例如,/foo(?!bar)/ 匹配后面没有“bar”的任何出现的“foo”。但是请注意,向前看和向后看不是一回事。您不能将其用于后视。 (来源:Working Demo Online。)

您的案例的负面展望

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

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