我创建了一个regular expression:
((\(\s*) #match start parens
|(\d+\.?\d*) #match a number
|([+-/%^!]) #match operators
|([*]) #match the asterisk operator
|(\s*\)))+ #match the end parens
应该分括括号,数字(整数和小数(3
和6.28
))和运算符(+-/*^%!
)。我尝试了一些测试
( (2 3 +) 6.28 +)
(3.14 6.28 +)
( (3 4 +) (5 6 +) *)
我注意到了一些事情。当我在带有两个起始parens的表达式上运行正则表达式时,它似乎忽略了一个括号,并且在站点上进行测试似乎产生了许多null和重复字符的实例。有没有办法匹配有效的表达式并将其分配给它自己的组?例如,如果我有表达式( (2 3 +) 6.28 +)
,则生成的组将是:[(
,(
,2
,3
,+
,6.28
,+
,)
]?
我记得有一个用户在这里发布了一个使用python正则表达式的答案,它就像一个魅力。表达式使用类似(?。)或(。?)和其余表达式的东西。不幸的是,我忽略了将其复制下来,答案已被删除。在那之后我尝试了相当多的调整但没有任何效果。任何额外的帮助表示赞赏。
答案 0 :(得分:2)
仅仅为了这项运动,我查看了你的RPN案例和非RPN案件的问题。以下是我提出的递归正则表达式(Perl,PCRE,带有regex
模块的Python),有几点需要注意:
<强> RPN 强>
^(\((?![ ]*[+/*-])(?:[ ]*|[+/*-](?![ ]*[+/*-])|(?:[ ]*\d+)?[ ]*\d+[ ]*[+/*-](?![ ]*[+/*-])[ ]*|(?1))*\))
在demo上,您可以看到它匹配的一些示例字符串,以及&#34;不正确的字符串&#34;失败的地方。
<强>非RPN 强>
^(\((?![*\/])(?:\d++|[+*\/-](?![+*\/-])|(?1))*(?<![+*\/-])\))
在demo上,您可以看到它匹配的一些示例字符串,以及&#34;不正确的字符串&#34;失败的地方。
<强>讨论强>
-1*
例如相关强>
如果不需要括号,事情会更容易。在this related question中,我们可以使用简短的
^\s*-?\d+(?:\s*[-+*/]\s*\d+\s*)+$