2010-02-02 176 views
3

我需要匹配一些运算符:=,!=,>,<,< =,> = 我需要匹配的字符串可能类似于:“2 = 2 OR 33> = 32 AND 3 < 5"正则表达式帮助匹配运算符

什么可以是正则表达式匹配表达式这一点,知道 - 我不希望收到一个‘< =’操作 一个‘=’匹配 - 的运营商可能会或可能不会有周围的空间

在此先感谢! 亚历

+0

你会最终会解析表达式与他们(嵌套)括号? – 2010-02-02 11:49:27

+0

我正在评估这些表达式,并且它可以是c#编译器可以理解的任何东西。 这将成为规则引擎的一部分,可以接受2种表达类型,c#和伪代码。 伪代码可以让你设计你的规则很像TFS查询生成器,但是如果你需要更快,预编译和更复杂的规则,你需要用c#编写它们。 这个表达式将用于去除伪代码表达式,但是括号和组运算符(AND/OR)的评估顺序将留给c#编译器来处理:) – AlexCode 2010-02-02 12:23:30

+0

如果'Left/Right Operand'包含引号,你需要检查他们是否关闭。 – serhio 2010-02-02 15:48:01

回答

9

试试这个:

(<=|>=|!=|=|>|<) 
+3

+1你是对的,Kobi的版本很优雅,但是你的可读性更强...... :)都得到了+1 – tanascius 2010-02-02 11:45:50

+2

请注意这些的顺序很重要。如果列表中的第一个小于号,则匹配<='会将每个字符作为单独的匹配返回。 – 2010-02-02 11:45:59

+0

我完全同意tanascius的可读性评论+1。 – Kobi 2010-02-02 11:46:54

4

这似乎工作:

[<>!]?=|[<>] 

这需要:<>!=(或只是=)之前,
OR:<>它们对。

这就是说,对于更多的复杂性,你可能需要一个解析器(例如,如果你想支持括号)

+0

+1,优雅的解决方案 – 2010-02-02 11:44:37

+1

(我正在刷新页面,渴望一个downvoter来解释我的错在哪里,因此,也许,学习一些新的东西) – Kobi 2010-02-02 11:50:36

+0

用http://derekslager.com/blog/posts /2007/09/a-better-dotnet-regular-expression-tester.ashx来源'=,!=,>,<, <=, > ='只能找到来自6的4个匹配项,不明白为什么... – serhio 2010-02-02 11:52:44

1

我的建议:[<>]=?|[!=]?=。匹配= != > < <= >= ==中的任何一个。

+0

不错的一个。如果没有'==',它可以是一个整洁的'[<>] =?|!?=' – Kobi 2010-02-02 13:05:38

+0

我的伪码操作符可以演化为更复杂的像'LIKE'运算符来比较字符串,所以我可能需要添加更多的运算符到可能与这些最初的不同的搜索模式。 我需要一个简单的模式,凸轮随着工具发展而不必重新考虑一个全新的工具,每次我想为一个新的操作员添加suppor。 – AlexCode 2010-02-02 14:51:09

0

你是否也试图获得数字?如果是的话。 。 。

/[0-9]+[ ]*(<=|>=|!=|=|>|<)[ ]*[0-9]+/ 

...在0-9一次或多次的范围内什么,其次是0或多个空格,然后你的运营商,0或多个空格以及任何在0-9的一个或多个范围倍。

这将让数和操作

+0

在这里,你会得到另一个问题集:该数字可以是负数,有小数位等 – 2010-02-02 12:45:38

+0

真的,在这种情况下,最好重写正则表达式来匹配它。我总是觉得最好是最完整的。如果你正在寻找复杂的,真实的,整数,整数或其他类型的数字,你应该编写正则表达式来匹配,而不是让它模棱两可,以后可能会遇到麻烦。 – Toymakerii 2010-02-02 14:10:31

+0

不,我只是为了识别操作符及其左右操作数和聚合操作符(如果有的话)(AND/OR)。 在我的例子中,我只写了数字,但我的操作数可以是任何有效的C#编译器成功编译,这是从简单的CLR类型到复杂的自定义类型。 所以我不介意用户编写的操作数是什么,只要它编译和评估对我来说很好。 – AlexCode 2010-02-02 14:46:42

1

[^?!><=]+\s*(?<operator>[><!]?=|[><])\s*[^?!><=]+ + ExplicitCapture

过滤器>>===== ==

+0

在搜索运算符之前,我首先通过逻辑运算符(AND/OR)拆分表达式。每个逻辑运算符之间只能有一个规则条件(左操作数,右操作数,右操作数)。 因此,如果在逻辑运算符之间找到多于一个运算符,解析器将自动抛出“无效的Empression”异常。 这样我就不需要对RegEx模式执行任何验证。 – AlexCode 2010-02-02 14:57:44

+0

我在想,我可能需要执行一个验证寿命...我需要跳过引号之间的运算符。如果一个操作数是一个包含操作符的字符串,可能会发生这种情况,例如:“Alex”=“” – AlexCode 2010-02-02 14:59:48

+0

如果您的操作数包含引号,则需要检查它们是否关闭。 – serhio 2010-02-02 15:37:29