我试图以字符串形式解析数字比较。我想对45+(30*2)<=50
之类的字符串进行标记,以使得结果组为45
,+
,(30 * 2)
,<=
和50
。
我知道我可以将我的群组定义为
\w*
用于数字术语\(.*\)
用于括号内的术语[\+\-\*\\=<>]{1,2}
用于运营商条款但我不知道怎么说“一个数字或括号术语后面跟着一个操作术语,整个事情重复了很多次,以数字或括号括起来”。
正则表达式是否可以实现这一点?
答案 0 :(得分:1)
正则表达式并不是这项工作的最佳工具。你可以实现你想要的东西,但是你必须跳过篮球。
第一个是嵌套构造,如45+((10 + 20)*2)<=50
,所以让我们先开始处理,因为\(.*\)
对你没有任何好处。它渴望并且不知道嵌套的构造。
这里只是括号的更好模式:
(?>
(?<p>\()
|(?<-p>\))
|(?(p)[^()])
)+
(?(p)(?!))
是的,这就是需要的。请阅读balancing groups以获得对此的深入解释。
数字术语将由\d+
或[0-9]+
(仅适用于.NET中的ASCII数字)匹配,而不是\w+
。
关于你的问题:
一个数字或括号后的术语,后跟一个操作术语,整个事物重复任意次,以数字或括号内的术语结束
你试图做错了。虽然可以使用PCRE正则表达式做到这一点,但它在.NET中会更难。
您可以将正则表达式用于 lexing (又名标记化)。但是然后使用应用程序代码来理解正则表达式返回的标记。不要将正则表达式用于语义,你不会得到漂亮的代码。
也许您应该使用现有的数学解析库,例如NCalc。
或者您可能需要使用自定义解决方案并build your own parser ...
答案 1 :(得分:0)
我希望以下正则表达式能够满足您的期望
(([><!=]{1}[=]{0,1})|[\+\-\*\/]{1}|\(.*\)|[\d]*| *)