【问题标题】:Regular expression: capture group might not exist. How do I write it?正则表达式:捕获组可能不存在。我该怎么写?
【发布时间】:2016-11-10 04:22:24
【问题描述】:

以下是一些我需要解析的字符串示例:

1 - Cream Soda (0.99)
5 - Potato Chips (2.50)
12 - Atlantic Salmon

我想获取第一个数字、产品名称和价格,包括括号。有时价格和相关的括号不存在。

我想出了这个正则表达式:

/(\d+)\s+-\s*(.+)\s+(\(.*\))/

仅当所有三个组都存在时才有效。我也试过这个:

/(\d+)\s+-\s*(.+)\s+(\(.*\))?/

但也好不到哪里去。

如何将第三个捕获组设为可选?

如果有什么不同,这是在 javascript 中。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以使第二组变得懒惰,并在第三组中使用行尾作为替代匹配:

    (\d+)\s+-\s*(.+?)\s*(\(.*\)|$)
    

    RegEx Demo

    【讨论】:

      【解决方案2】:

      您可以使用可选的非捕获组包裹尾随部分,并且该模式需要使用锚点包裹:

      /^(\d+)\s+-\s*(.*?)(?:\s+(\([^()]+\)))?$/
      

      regex demo

      详情

      • ^ - 字符串开头
      • (\d+) - 第 1 组捕获前 1 个或多个数字
      • \s+ - 1 个或多个空格
      • - - 一个连字符
      • \s* - 0+ 个空格
      • (.*?) - 第 2 组捕获任何 0+ 个字符,但尽可能少
      • (?:\s+(\([^()]+\)))? - 一个可选组,匹配 1 个或 0 个序列:
        • \s+ - 1+ 个空格
        • (\([^()]+\)) - 第 3 组捕获 (,除 () 之外的 1+ 个字符,然后是 )
      • $ - 字符串结束。

      var strs = ["1 - Cream Soda (0.99)", "5 - Potato Chips (2.50)", "12 - Atlantic Salmon"];
      var re = /^(\d+)\s+-\s*(.*?)(?:\s+(\([^()]+\)))?$/;
      for (var s of strs) {
        var m = re.exec(s);
        if (m) {
          console.log("1: " + m[1] + ", 2: " + m[2] + (m[3] ? ", 3: " + m[3] : ""));
        }
      }

      【讨论】:

      • 我喜欢正则表达式的强大功能和灵活性,但它绝对不是我的强项。这样就行了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      相关资源
      最近更新 更多