形成正则表达式以解析数字表达式

时间:2016-02-05 07:46:35

标签: c# regex

我试图以字符串形式解析数字比较。我想对45+(30*2)<=50之类的字符串进行标记,以使得结果组为45+(30 * 2)<=50

我知道我可以将我的群组定义为

  • \w*用于数字术语
  • \(.*\)用于括号内的术语
  • [\+\-\*\\=<>]{1,2}用于运营商条款

但我不知道怎么说“一个数字或括号术语后面跟着一个操作术语,整个事情重复了很多次,以数字或括号括起来”。

正则表达式是否可以实现这一点?

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]*| *)