正则表达式中的可选分组

4

我正在寻找一个正则表达式,可以匹配以下4种情况(提取ID以便重新编写URL)。

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})(/)?)?

你为什么不在“/”处分割字符串? - halex
3个回答

3

.*(你第二次使用它)是贪婪的。因此,它会消耗掉所有内容,直到最后一个ID。这就是为什么如果有两个ID时,第一个ID会丢失。请将其改为非贪婪模式:

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

为了方便,我还在最后的 .* 后加了一个 ?,以防您想添加更多的参数。然而,仅仅通过 / 分割字符串可能更加简单。


1

只需将正则表达式中的第二个.*更改为.*?,即可获得您期望的示例字符串的捕获组:

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

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


1

我知道这不完全是你想要的,但你考虑过类似以下方案吗:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接