29

我不太确定这种正则表达式的正确措辞是什么,但基本上我想要做的是匹配任何以“/”开头但后面没有“bob/”的字符串,例如.

所以这些会匹配:

/tom/
/tim/
/steve

但这些不会

tom
tim
/bob/

我确信答案非常简单,但是我很难在任何地方搜索“regex not”。我敢肯定,对于我想要的东西,有一个更漂亮的词会带来好的结果,但我不确定它会是什么。

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

4

2 回答 2

29

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

/^\/(?!bob\/)/
于 2012-04-04T00:23:03.637 回答
3

TLDR:负前瞻

如果你想要一个否定的前瞻只是为了找到"foo"它什么时候没有被"bar"......

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

在线工作演示

来源

引用文档...

(?!pattern)

(*nla:pattern)

#(*negative_lookahead:pattern)

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

您的案例的负面预测

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

/^\/(?!bob\/)/
  • ^— 仅匹配字符串的开头。
  • \/— 匹配/我们需要转义的字符,因为它是正则表达式格式的字符(即s/find/replacewith/,等)。
  • (?!...)— 如果匹配后有 ,则不匹配...
  • bob\/— 这是...值,不要匹配bob/', once more, we need to escape the /`。
于 2021-07-05T19:25:43.533 回答