正则表达式负前瞻性的词

Regex With Negative Lookahead For Word

使用 PCRE 风格,我试图想出一个匹配 URL 的正则表达式,只要它在 /songs/{id} [= 之后不包含 /foo 14=]

/songs/902   => Match
/songs/902/   => Match
/songs/902/foo   => No Match
/songs/902/foo/201/bar   => No Match
/songs/902/bar   => Match

这是我目前所拥有的^\/songs\/.+(?!\/foo).*$,但它似乎与所有给定的示例相匹配。

使用

^\/songs\/(?!.*\/foo).+

参见proof^\/songs\/ 在开头定位 /songs/,然后 (?!.*\/foo) 检查字符串后面是否存在 /foo.+ 匹配剩余的内容。

您正在使用 /songs/.+(?!\/foo),其中在贪婪 .+ 之后应用负前瞻,在 /songs/ 之后将匹配所有内容,包括 /foo 直到结束然后它将满足前瞻断言。您需要在匹配 /songs//songs/<digits>.

之后应用前瞻断言

您可以在 php 中使用此正则表达式进行否定前瞻:

~/songs/\d+(?!.*/foo\b)~

RegEx Demo

正则表达式详细信息:

  • /songs/\d+:匹配/songs/后跟1+位数字
  • (?!.*/foo\b):如果我们在当前位置之前有 /foo,则否定前瞻使匹配失败。

代码:

$re = '~/songs/\d+(?!.*/foo\b)~';
preg_match_all($re, $input, $matches);

// Print the match result
var_dump($matches[0]);