我想要一个正则表达式,它将匹配一对括号内的有效数学表达式,不包含任何自己的括号。
例如,给定以下输入,正则表达式应匹配3*4.5
:
(1 + 2 + 3 + 5 * 9 + 2 + 3 +(3 * 4.5))
我编写了以下正则表达式,它匹配括号内最多一个数学运算的简单情况:
(?:-?\()(-?\d*\.*\d*\s*[-\+\*/]?\s*-?\d*\.*\d*)(?:\))
它成功匹配3*4.5
。
但是,由于数学运算的数量未知,我需要解决方案更通用。天真地,我认为这样可行(在捕获组之后添加+
):
(?:-?\()((-?\d*\.*\d*\s*[-\+\*/]?\s*-?\d*\.*\d*)+)(?:\))
但是,结果是超时。请参阅here。
对于下面的输入,所需的正则表达式应返回 3 * 4.5 + 7/3 * -2
(1 + 2 + 3 + 5 * 9 + 2 + 3 +(3 * 4.5 + 7/3 * -2))
答案 0 :(得分:2)
您需要一个与(
匹配的正则表达式,然后是)
和(
以及)
以外的任何字符:
\(([^()]+)\)
见demo。结果将被捕获到第1组中。
或者,如果您有未经过滤的输入(即它可以包含(The dog barks at midnight.&@$:*{^{%{#]£¥28/9")
之类的字符串,我们可以将其限制为禁止使用\(([^a-zA-Z()]+)\)
内的任何字母(请参阅demo)。
var re = /\(([^()]+)\)/g;
var str = '(1 + 2 + 3 + 5 * 9 + 2 + 3 + (3 * 4.5 + 7 /3 * -2))\n(1 + 2 + 3 + 5 * 9 + 2 + 3 + (3*4.5))';
var m;
while ((m = re.exec(str)) !== null) {
document.getElementById("res").innerHTML += m[1] + "<br/>";
}
&#13;
<div id="res"/>
&#13;