1

I'm trying to match every string (url) starting with "string" and not ending in -[number]

So I made this regex

string/?.*(?!-[0-9]*)

which, for what I understood, is supposed to be read as:

match every string starting with "string", having possibly a '/' after it, having any string after it not including '-' followed by any number or numbers.

here's my test strings

string/kkk/aaa/sss/ddd-123
string/kkk/aaa/sss/ddd
string/kkk/aaa/sss
string/kkk/aaa
string/kkk
string/
string/kkk/
string/kkk/aaa/
string/74002

the regex just match everything, no matter what.

Could someone tell me where I went wrong ?

4

3 回答 3

2

在您的表达式中,您.*在前瞻之前添加了。

这意味着将在继续下一步之前*跳过所有可用的字符匹配- 这本质上就是一切,因此您的表达式匹配一切。.当您想要在模式之后返回所有内容时,通常会使用此选项。

您需要将.*in 移至前瞻语句或使用非贪婪版本。

尝试类似的东西

^string/?(?!.+?-\d+$).*

以上将匹配所有不以-和数字结尾的字符串。对于匹配模式的实例,它还将返回整个字符串。我在这里使用了非贪婪.+?来避免混淆以及添加行选择器的^开始和$结束。.*如果模式成功,则匹配所有字符。

于 2013-07-25T09:56:12.020 回答
0

您的问题是您不强制正则表达式匹配整个字符串。

例如,采取这一行:

string/kkk/aaa/sss/ddd-123

在这种情况下.*,将简单地匹配string/包括-123. 非贪婪匹配将匹配除d-123. 在任何一种情况下,它都成功地没有找到负前瞻中给出的内容。

您必须强制正则表达式匹配字符串 end ( $) (也可能是字符串 start ( ^):

^string/?.*(?!-[0-9]*)$
于 2013-07-25T09:16:46.333 回答
0

尝试这个 :

$str  = "string/kkk/aaa/sss/ddd123";
echo preg_match("/^string\/(?!.*-\d+$)/",$str);
于 2013-07-25T09:15:29.940 回答