regex - 正则表达式 : capture group might not exist. 怎么写?

标签 regex

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

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

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

我想出了这个正则表达式:
/(\d+)\s+-\s*(.+)\s+(\(.*\))/

仅当所有三个组都存在时才有效。我也试过这个:
/(\d+)\s+-\s*(.+)\s+(\(.*\))?/

但也好不到哪里去。

如何使第三个捕获组可选?

如果它有任何区别,这是在javascript中。

最佳答案

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

/^(\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] : ""));
      }
    }

    关于regex - 正则表达式 : capture group might not exist. 怎么写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40515188/

    相关文章:

    C++使用正则表达式标记字符串

    regex -\d{1-3 }在正则表达式中的含义

    regex - Fiddler 自动回复 + 正则表达式

    javascript - 在句号处拆分文本结尾会创建空字符串

    r - Stringr - 删除连字符两侧的前导零

    excel - 从 VBA 中的范围中删除特殊字符

    Javascript 正则表达式 - 从 url 中删除变量(如果存在)

    excel - 如何匹配重音字符而不是制表符

    python - 寻找包含字母数字 + "&"和 ";"的正则表达式

    regex - 为什么正则表达式不能使用关键字而不是字符?