正则表达式 - 匹配括号

时间:2015-05-28 12:09:20

标签: javascript regex

我想要一个正则表达式,它将匹配一对括号内的有效数学表达式,不包含任何自己的括号

  • 输入已预先验证,且仅包含有效的数学表达式。

例如,给定以下输入,正则表达式应匹配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))

1 个答案:

答案 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;
&#13;
&#13;