正则表达式带有负词的超前查找

时间:2020-05-22 18:18:09

标签: regex pcre regex-lookarounds

使用PCRE风格,我想提出一个匹配URL的正则表达式,只要它在/foo

之后不包含/songs/{id}
/songs/902   => Match
/songs/902/   => Match
/songs/902/foo   => No Match
/songs/902/foo/201/bar   => No Match
/songs/902/bar   => Match

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

2 个答案:

答案 0 :(得分:2)

使用

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

请参见proof^\/songs\//songs/放在开头,然后(?!.*\/foo)检查字符串中是否以后有/foo,并且.+匹配剩余的内容。

答案 1 :(得分:1)

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

您可以在php中使用此正则表达式,使负前瞻:

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

RegEx Demo

RegEx详细信息:

  • /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]);
相关问题