【问题标题】:Optional groups in regular expressions正则表达式中的可选组
【发布时间】:2014-01-29 09:34:55
【问题描述】:

我当前的正则表达式:

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

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

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

我怎样才能匹配这个some-meta-description-- 部分?我想匹配整个 products/... url,然后删除除 1488382.aspx 之外的所有内容。

【问题讨论】:

  • 您是否尝试过从 url 中删除“元描述”?

标签: c# regex


【解决方案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 似乎没有针对其特定语法的选项。您始终可以删除 ?: 并忽略元描述匹配(或者您实际上有时可能也想要它)。或者它可能只是在( 之后没有冒号的?) 之后的 ? 是“可选”限定符。

【讨论】:

    【解决方案2】:

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

    explanation on regex 101

    【讨论】:

    • +1 用于链接到正则表达式 101。没有它,我无法完善和测试我的答案示例。
    猜你喜欢
    • 2010-11-04
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2021-10-06
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多