以下是我需要解析的字符串的一些示例:
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/