我正在用 javascript 解析文件并且必须捕获一些值。例如下面的速度值。例如:
> "velocity(22)".match("\\(([^()]*)\\)");
[ '(22)', '22', index: 8, input: 'velocity(22)' ]
以上工作正常,22
在 match[1] 中被捕获。问题是当值具有括号中提到的单位时。例如:
> "velocity(22 (m/s))".match("\\(([^()]*)\\)");
[ '(m/s)', 'm/s', index: 12, input: 'velocity(22 (m/s))' ]
如上所示,捕获的是 m/s
而不是 22 (m/s)
在括号内捕获时忽略括号的正确方法是什么?
最佳答案
试试这个:
const num = "velocity(43)";
const units = "velocity(22 (m/s))";
const regex = /\(((\d+)(?: \((.+)\))?)\)/
console.log(num.match(regex));
console.log(units.match(regex));
表达式:/\(((\d+)(?:\((.+)\))?)\)/
我们首先匹配一个括号:(\(
) 并在它之后捕获 1 个或多个数字 ((\d+)
)。这将是捕获组 2。我们然后想用条件判断是否有单位,我们用非捕获组((?:ABC)
)对字符进行分组,不捕获不需要的空格,里面找空格后跟括号中的任意一组字符 ((?:\((.+)\))
)。这组字符被捕获为捕获组 3,我们将非捕获组定义为可选 ?
。然后我们检测右括号 \)
并将整个选择包装在捕获组 1 中。如果您希望捕获单位周围的封闭括号,那么只需将捕获组放在转义括号字符周围而不是内部。
关于javascript - 正则表达式在括号内捕获时忽略括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51369275/