【问题标题】:Regex C# - optional group in the middle正则表达式 C# - 中间的可选组
【发布时间】:2021-10-06 06:48:52
【问题描述】:

我有这样的源文本,中间有一个可选组:

GH22-O0-TFS-SFSD 00-1-006.19135
GH22-O0-TFS-SFSD 00-1-006.1.19135

第一种情况下的期望值为“19135”,第二种情况下为“1.19135”。

正则表达式必须匹配整个字符串并选择第一个“。”之后的所有字符。 - 这是我的第 1 组。我尝试创建子组并将第 3 组标记为可选,但它不起作用。

正则表达式:

.*\.0*(([0-9])(\.0*([0-9]+)))

应如何更改以获取所需的值?

【问题讨论】:

  • 第一个周期后得到所有东西? regexr.com/3elkd
  • 建议的解决方案不行,因为正如我所提到的:正则表达式应该匹配整个文本并选择值作为一个组。
  • 您似乎需要锚点、开头的惰性点图案和可选的非捕获组。

标签: c# regex


【解决方案1】:

这应该适合你:

.*?\.(.*)

这将匹配整个字符串,并包括捕获组 1 中第一个句点之后的所有内容,无论字符类型如何。

【讨论】:

    【解决方案2】:

    你可以使用

    ^(.*?)\.0*(\d+)(?:\.0*(\d+))?$
    

    请参阅regex demo详情

    • ^ - 字符串开头
    • (.*?) - 第 1 组:除 LF 字符之外的任何零个或多个字符,尽可能少(因为 *? 是一个惰性量词)
    • \. - 一个点
    • 0* - 零个或多个零
    • (\d+) - 第 2 组:任意一位或多位数字
    • (?:\.0*(\d+))? - . 的可选出现,零个或多个零,然后第 3 组捕获一个或多个数字
    • $ - 字符串结束。

    【讨论】:

      【解决方案3】:

      我希望我了解您的目标,这应该可行:

      .*?\.([\d.]+)
      
      • .*?\. - 大致捕捉到第一阶段之前的所有内容
      • ([\d.]+) - 将剩余的数字和句点捕获到捕获组 #1

      https://regex101.com/r/0t9Ijy/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-04
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        相关资源
        最近更新 更多