正则表达式与可选组

时间:2012-10-12 18:48:15

标签: regex

我正在寻找一个匹配以下4个案例的单一正则表达式(抓住id,以便我可以重新编写网址)

http://localhost/gallery/test-name/123456
http://localhost/gallery/test-name/123456/
http://localhost/gallery/test-name/123456/video-name/159
http://localhost/gallery/test-name/123456/video-name/159/

当前正则表达式在下面,但在所有情况下都没有正确抓取ID。那里的任何专家都知道我做错了什么?

^(.*)/gallery/(.*)/([0-9]{1,15})(/)?((.*)/([0-9]{1,15})(/)?)?

3 个答案:

答案 0 :(得分:3)

.*(你第二次使用它)是贪婪的。因此它会消耗所有内容直到您的最后一个ID。这就是为什么第一个ID会丢失,如果你有两个。不要说它:

^(.*)/gallery/(.*?)/([0-9]{1,15})(/)?((.*?)/([0-9]{1,15})(/)?)?

如果您想为此添加更多参数,我还在最后?添加了.*。但是,无论如何,简单地拆分字符串/可能会简单得多。

答案 1 :(得分:1)

只需将正则表达式中的第二个.*更改为.*?,您就应该获得所需的示例字符串捕获组:

^(.*)/gallery/(.*?)/([0-9]{1,15})(/)?((.*)/([0-9]{1,15})(/)?)?

示例:http://www.rubular.com/r/CdBgdA1PlY

答案 2 :(得分:1)

我知道这不是你想要的,但你有没有考虑过以下几点:

string l_url = "http://localhost/gallery/test-name/123456/video-name/159";
string l_id = l_url.Split( '/' )[5];

由于您没有指定语言,上面的内容是C#,但可以轻松转换为任何其他语言。