2014-10-20 56 views
0

我尝试写一个正则表达式匹配条件表达式,例如:Java的正则表达式(分组)

a!=2  1+2<4  f>=2+a 

和我尝试提取操作。 我的当前正则表达式是“。+([!= <>] +)。”+“

但问题是匹配器总是试图匹配组中最短的字符串。例如,如果表达式是!= 2,则组(1)是“=”,而不是“!=”,这正是我所期望的。

那么我应该如何修改这个正则表达式来实现我的目标呢?

+0

''只能代表一个字符[= <>!]。阅读[量词](http://docs.oracle.com/javase/tutorial/essential/regex/quant.html)(特别是关于贪婪和不情愿)。 – Pshemo 2014-10-20 20:14:37

+0

回复pshemo:对不起,这是我输入问题时输入错误。现在它被纠正 – user2829353 2014-10-20 20:20:11

+0

问题保持不变。首先'。+'是贪婪的,所以它会消耗可以通过'[!= <>] +'匹配的字符。你需要让它不愿意(或者''''你可以使用否定字符集来防止匹配'!= <>')。 – Pshemo 2014-10-20 20:24:23

回答

1

你想匹配一个运算符包围的运算符而不是

操作员,在你的定义:[!= <>]

相反,不是一个运营商将是:[^ = <>!]

然后尝试:

[^!=<>]+([!=<>]+)[^!=<>]+ 
+0

谢谢!这工作完美。 – user2829353 2014-10-20 20:44:45

+0

很高兴听到它!然后我鼓励你将这个问题标记为已解决,这将从未解决的问题线程中删除它。 – 2014-10-20 21:28:01

0

试试这个:

.+(!=|[=<>]+).+ 

你的正则表达式匹配一个单一的!,因为它是在[]

一切都放在括号将匹配单个字符,这意味着[!=<>]可以匹配:!, =, <, >

+0

谢谢,但这实际上不起作用。 。+仍然吃起来! – user2829353 2014-10-20 20:45:36

+1

不,这是导致问题的前导'。+'的贪婪,正如[另一个答案](http://stackoverflow.com/a/26474663/20938)中所解释的。 – 2014-10-20 23:59:44

1

您也可以尝试不情愿或不贪婪版本(见that other posr进行广泛的解释)。在你的榜样,那就是:

.+?([!=<>]+).+ 

但这正则表达式可以匹配不正确的比较像a <!> b,或a =!><=! b ...