正则表达式中的可选组

时间:2014-01-28 19:50:44

标签: c# regex

我现在的正则表达式:

Products\/([0-9-]+)\.aspx

这匹配产品网址,如产品/ 1488382.aspx,产品/ 1239499-2881839.aspx等。还有其他检查,看看检索到的产品是否确实存在(即有人做-4-9381--2会通过正则表达式,但实际上没有产品存在。)。

还有其他网址具有以下格式:products / some-meta-description-1488382.aspx

我如何匹配此some-meta-description--部分?我想匹配整个产品/ ...网址,然后删除除1488382.aspx之外的所有内容。

2 个答案:

答案 0 :(得分:1)

products\/(?:some-meta-description-)?([0-9-]+)\.aspx

explanation on regex 101

答案 1 :(得分:1)

感谢Yann Moisan的灵感,但我认为他略微低估了这些要求。

如果你想跳过一个可选的任意字母数字前缀,然后将一个仅限数字的最终组匹配为真实的ID我认为它会是这样的:

Products\/(?:[0-9a-zA-Z-]*-)?([0-9-]+)\.aspx(如果A-Z不区分大小写,则删除它)

但是如果你想在一个可选的任意字母数字前缀之后匹配多个仅限数字的组,它会变得有点复杂:

Products\/(?:[0-9a-zA-Z-]*[a-zA-Z][0-9a-zA-Z]*-+)?([0-9-]+)\.aspx

这里的想法是它在包含字母的最后一个组中查找任意字母数字前缀,然后期望一个或多个破折号(所有这些可选)将它与任意数量的数字组的匹配分开破折号。如果你需要在最后一组中单独匹配数字组,你可能只需要取所有数字组的字符串,然后在C#中进行拆分。

这不包括包含最终数字组的元描述(如果用最后一个包含字母的组的短划线分隔)。

这也假定C#/ .NET正则表达式包含非匹配组的?:语法。 Regex 101似乎没有针对其特定语法的选项。您始终可以删除?:并忽略元描述匹配(或者您实际上可能有时也想要它)。或者在没有冒号的?之后它可能只是(?之后的)是“可选”限定符。