JavaScript中的复杂正则表达式

JavaScript中的复杂正则表达式,javascript,regex,Javascript,Regex,我的任务是: 对字符串中的所有数字求和并执行乘法 input: "3 chairs, 2 tables, 2*3 forks" result: 11 但我想添加忽略括号内数字的选项“()” 输入:“2张椅子,3张桌子(1张坏了)” 结果:5 怎么做 正则表达式对我来说总是很痛苦:(一个简单的方法是第一次遍历并删除所有带括号的表达式 str = str.replace(/\([^\)]*\)/g, ""); // now run your original algorithm to sum/mul

我的任务是: 对字符串中的所有数字求和并执行乘法

input: "3 chairs, 2 tables, 2*3 forks" result: 11 但我想添加忽略括号内数字的选项“()”

输入:“2张椅子,3张桌子(1张坏了)” 结果:5 怎么做


正则表达式对我来说总是很痛苦:(

一个简单的方法是第一次遍历并删除所有带括号的表达式

str = str.replace(/\([^\)]*\)/g, "");
// now run your original algorithm to sum/multiply...
// ...
这不是超级高效,但它确实起到了作用

我应该注意的是,这并不处理嵌套的括号,但这里似乎不需要嵌套的括号。

您可以使用
indexOf()
lastIndexOf()
来检测最外面的括号,这样您就可以去掉您想要的。这适用于不定括号

(?=(\d+[\d.*]*)(?![^(]*?\)))\1
(?=(
开始使用“向前看”按钮捕获组

(\d+[\d.*]*)
是您的号码的捕获组

(?![^(]*?\))
是一个负正向查找,确保数字后面没有开括号

)\1

此处的“向前看”结尾与找到的数字匹配。

+1将要在前面的答案中添加replace(/(.*)/,“”),但将其删除,因为您使用正确的正则表达式说出了相同的想法,并考虑到它的“贪婪”性质。谢谢!我不关心效率,因为字符串很短。在这个表达式中失败:
“2(不是3)和3(不是4)”
。您实际上需要一个堆栈或类似的东西来跟踪到目前为止看到的左paren,每当您看到右paren时就会弹出。
(?![^(]*?\))
)\1