让我说这是url的
site.com/hello-world/test.html
site.com/hello-world/test/test.html
如果我去第一个网址我有这个正则表达式
^.*/([a-z0-9,-]+)/([a-z0-9,-]+).html$
但是url 2也是正则表达式的vaild url?如何告诉正则表达式第一个url是应该是vaild的url而不是第二个?
答案 0 :(得分:3)
当然第二个字符串对你的正则表达式也是有效的:
sub-expression result ----------------------------------------------------------------------- ^.* matches: "site.com/hello-world/test/test.html" / backtrack: "site.com/hello-world/test/" ([a-z0-9,-]+) matches: "site.com/hello-world/test/test" / backtrack: "site.com/hello-world/test/" ([a-z0-9,-]+).html$ matches: "site.com/hello-world/test/test.html"
更好:
sub-expression result ----------------------------------------------------------------------- ^[^/]+ matches: "site.com" / matches: "site.com/" ([a-z0-9,-]+) matches: "site.com/hello-world" / matches: "site.com/hello-world/" ([a-z0-9,-]+)\.html$ fails (which is the expected result)
所以你应该使用:
^[^/]+/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$
答案 1 :(得分:1)
对于第一个网址,该模式的。*部分与“site.com”匹配,但对于第二个网址,则匹配“site.com/hello-world”。
如果您不想允许多个文件夹,则可以禁止模式中与域名匹配的部分中的斜杠字符:
^[^/]*/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$
(请注意,我在html扩展名之前的一段时间之前放了一个反斜杠。一个句点匹配任何一个字符,而\.
只匹配一个句点。)
编辑:
如果要允许两个URL并使用“hello-world / test”作为第二个文件夹,请在文件夹部分中添加斜杠:
^[^/]*/([a-z0-9,-/]+)/([a-z0-9,-]+)\.html$
如果要将“hello-world”用作文件夹并将“test / test”用作页面,请在文件名部分中添加斜杠:
^[^/]*/([a-z0-9,-]+)/([a-z0-9,-/]+)\.html$
答案 2 :(得分:0)
我认为问题是在表达式的开头使用贪婪的match-all。*。
作弊:
^.*(com|org|edu|net|gov)/([a-z0-9,-]+)/([a-z0-9,-]+).html$
答案 3 :(得分:0)
。*在第二种情况下匹配“site.com/hello-world”。您必须更具体地了解域名部分。
答案 4 :(得分:0)
在第二种情况下,。*匹配超出预期。
也许用非贪婪的量词替换它:
^.*?/([a-z0-9,-]+)/([a-z0-9,-]+).html$
答案 5 :(得分:0)
不是解决方案,只是一个建议:有很多优秀的工具可以让你试验正则表达式并实际帮助你编写它们。
我特别喜欢Expresso;显然The Regulator也是一个非常好的。