JavaScript中的复杂正则表达式

5
我有这个任务: 对字符串中的所有数字求和并执行乘法
输入:“3把椅子,2张桌子,2*3把叉子” 结果:11
我已经有了正则表达式来完成这个任务:
eval(str.match(/(\d[\d\.\*]*)/g).join(' + '))

我想要添加一个选项,忽略括号“()”中的数字

输入:“2 chairs, 3 tables (1 broke)”
结果:5

应该怎么做呢?

对我来说,正则表达式总是很麻烦 :(

3个回答

5

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

str = str.replace(/\([^\)]*\)/g, "");
// now run your original algorithm to sum/multiply...
// ...

虽然这种方法并不是非常高效,但它确实能够完成任务。

需要注意的是,这种方法不能处理嵌套的括号,但在这里似乎也不需要。


+1,我本来要在之前的答案中添加replace(/(.*)/,""),但因为你提供了一个正确的正则表达式,并考虑到它的“贪婪”特性,所以我删除了它。 - user649198
很好,谢谢!我不关心效率,因为字符串很短。 - Ildar

0
你可以使用 indexOf()lastIndexOf() 来检测最外层的括号,以便摆脱你想要的内容。这适用于无限制的括号。

这个表达式会失败:"2(不是3)and 3(不是4)"。你实际上需要一个堆栈或类似的东西来跟踪到目前为止看到的左括号,每当看到右括号时就弹出。 - bobbymcr

0
(?=(\d+[\d.*]*)(?![^(]*?\)))\1

(?=( 开始使用前瞻捕获一个组

(\d+[\d.*]*)

这是捕获组,用于匹配您的数字

(?![^(]*?\))

是一种负向前瞻,用于确保数字后面没有开放的括号

)\1

期待结束于匹配到的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接