javascript - 正则表达式在括号内捕获时忽略括号

标签 javascript regex

我正在用 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/

相关文章:

Python 非贪婪正则表达式

javascript - 提交表单时,清除所选项目

javascript - 单击 MarkerClusterer 时,Google map API v3 事件单击会引发?

javascript - 检测浏览器关闭所有条件

python - Django 中过滤内的正则表达式

php - 如何从 HTML 注释标签中删除缩进或空格?

javascript - 使用 for 循环更快地分配包含 jquery 选择器的多个变量

javascript - RxJS:auditTime 和 sampleTime 之间的区别?

java - 操纵 IP 地址 - 在 '.' 字符处拆分字符串

c++ - 如何在 C++ 的正则表达式中使用变量?