再次出现正则表达式的问题

时间:2009-09-08 12:55:37

标签: c# regex

让我说这是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而不是第二个?

6 个答案:

答案 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也是一个非常好的。

相关问题