正则表达式负前瞻性的词
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)~
正则表达式详细信息:
/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]);
使用 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)~
正则表达式详细信息:
/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]);