【问题标题】:Regex - match mathematical expressions inside parenthesis正则表达式 - 匹配括号内的数学表达式
【发布时间】:2015-05-28 12:09:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您需要一个匹配( 的正则表达式,然后是)( 以外的任何字符,然后是)

    \(([^()]+)\)
    

    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/>";
      }
    &lt;div id="res"/&gt;

    【讨论】:

    • 这也匹配(The dog barks at midnight.&amp;@$:*{^{%{#]£¥28/9")。这似乎与 OP 匹配“括号内的有效数学表达式”的要求不兼容。
    • 我认为输入已经被“过滤”了。至少在问题中没有提到任何内容。当然,正则表达式可以通过禁止字母来改进,比如\(([^a-zA-Z()]+)\)
    • 你可能是对的;我只是把这个扔出去。也许OP可以澄清。
    • 是的,输入是预先验证的。我将其添加到其他人的问题中。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2016-02-13
    • 2011-07-18
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多