【问题标题】:The value is cut off while retrieving the value via regular expression通过正则表达式检索值时该值被截断
【发布时间】:2021-10-18 19:08:21
【问题描述】:

我正在尝试创建一个通用正则表达式,允许从以下字符串中获取数字值:

  • C1_S2_G11_SH2761
  • C1_S1_G789
  • C2_S2_SH6917
  • C1_S1_G78_G432
    public Regex testRegex = new Regex("^C(?<classId>\\d+)_S(?<segmentId>\\d+)_(G|SH)(?<groupShopId>\\d+)(|_|_G|_SH)(?<subGroupShopId>\\d+)$");

一旦我尝试从字符串 C2_S2_SH6917 中获取值:

var match = testRegex.Match(string)

var groupShopIdValue = match.Groups["groupShopId"].Value

它只返回 SH 691 之后的前三位数字,但我希望在 SH 6917

之后得到所有四位数字

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    你可以使用这个正则表达式:

    ^C(?<classId>\d+)_S(?<segmentId>\d+)_(?:G|SH)(?<groupShopId>\d+)(?:_(?:G?|SH)(?<subGroupShopId>\d+))?$
    

    请参阅regex demo。最后一个 __G_SH 后跟数字现在是可选的。所有不必要的捕获组现在都是非捕获的,并且不会弄乱正则表达式匹配对象。

    详情

    • ^ - 字符串开头
    • C - 一个 C 字符
    • (?&lt;classId&gt;\d+) - 组“classId”:一位或多位数字
    • _S - _S 字符串
    • (?&lt;segmentId&gt;\d+) - 组“segmentId”:一位或多位数字
    • _ - 下划线
    • (?:G|SH) - GSH
    • (?&lt;groupShopId&gt;\d+) - 组“groupShopId”:一位或多位数字
    • (?:_(?:G?|SH)(?&lt;subGroupShopId&gt;\d+))? - 可选序列
      • _(?:G?|SH) - _,然后是可选的 GSH
      • (?&lt;subGroupShopId&gt;\d+) - 组“subGroupShopId”:一位或多位数字
    • $ - 字符串结束。

    【讨论】:

      【解决方案2】:

      7 匹配为 subGroupShopId 的一部分。

      【讨论】:

      • 感谢@Kristof 的留言!如何更新正则表达式以避免这种分裂?
      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      相关资源
      最近更新 更多