正则表达式计算器

时间:2014-01-14 17:00:39

标签: regex

我创建了一个regular expression

((\(\s*)          #match start parens
|(\d+\.?\d*)      #match a number
|([+-/%^!])       #match operators
|([*])            #match the asterisk operator
|(\s*\)))+        #match the end parens

应该分括括号,数字(整数和小数(36.28))和运算符(+-/*^%!)。我尝试了一些测试

( (2 3 +) 6.28 +)  
(3.14 6.28 +)
( (3 4 +) (5 6 +) *)

我注意到了一些事情。当我在带有两个起始parens的表达式上运行正则表达式时,它似乎忽略了一个括号,并且在站点上进行测试似乎产生了许多null和重复字符的实例。有没有办法匹配有效的表达式并将其分配给它自己的组?例如,如果我有表达式( (2 3 +) 6.28 +),则生成的组将是:[((23+6.28+)]?

我记得有一个用户在这里发布了一个使用python正则表达式的答案,它就像一个魅力。表达式使用类似(?。)或(。?)和其余表达式的东西。不幸的是,我忽略了将其复制下来,答案已被删除。在那之后我尝试了相当多的调整但没有任何效果。任何额外的帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

仅仅为了这项运动,我查看了你的RPN案例和非RPN案件的问题。以下是我提出的递归正则表达式(Perl,PCRE,带有regex模块的Python),有几点需要注意:

  1. 我处理了问题的匹配部分,而不是标记部分。
  2. 我没有调整它们,所以请将它们作为起点。
  3. <强> RPN

    ^(\((?![ ]*[+/*-])(?:[ ]*|[+/*-](?![ ]*[+/*-])|(?:[ ]*\d+)?[ ]*\d+[ ]*[+/*-](?![ ]*[+/*-])[ ]*|(?1))*\))
    

    demo上,您可以看到它匹配的一些示例字符串,以及&#34;不正确的字符串&#34;失败的地方。

    <强>非RPN

    ^(\((?![*\/])(?:\d++|[+*\/-](?![+*\/-])|(?1))*(?<![+*\/-])\))
    

    demo上,您可以看到它匹配的一些示例字符串,以及&#34;不正确的字符串&#34;失败的地方。

    <强>讨论

    • 有可能我没想到这些模式允许不正确的操作。我做得很快。如果你找到一个,请告诉我,我们会寻找解决方案。 :)
    • 我没有处理小数 - 一个简单的添加,如果你选择的话就留给你。
    • 在RPN中我没有处理负数(通常在计算器上有一个特殊键):相反,你可以-1*例如
    • 为了整洁,在非RPN上我没有允许任何空格,但这样做并不难。

    相关

    如果不需要括号,事情会更容易。在this related question中,我们可以使用简短的

    ^\s*-?\d+(?:\s*[-+*/]\s*\d+\s*)+$