我想从Java中的匹配模式中提取值

时间:2013-08-16 06:54:44

标签: java regex

我正在使用这个正则表达式:

  

([\ w \ s] +)(= |!=)([\ w \ s] +)((或|和)([\ w \ s] +)(= |!=)([ \ W \ S] +))*

匹配以下字符串:i= 2 or i =3 and k!=4

当我尝试使用m.group(index)提取值时,我得到: (i, =, 2, **and k!=4**, and, k, ,!=, 4).

预期输出:(i,=,2,或,i,=,3,和,k,!=,4) 如何正确提取值?

P.S。 m.matches()返回true。

4 个答案:

答案 0 :(得分:3)

你试图匹配表达式上的正则表达式...你可能想要使用解析器,因为这个正则表达式(当你拥有它时)无法进一步扩展..但是解析器可以在任何地方扩展时间

例如,考虑使用antlr(ANTLR: Is there a simple example?

答案 1 :(得分:2)

这是因为你的第三组parens(你用来重复表达的那一组)让你感到困惑。尝试使用非捕获的parens:

([\w\s]+)(=|!=)([\w\s]+)(?: (or|and) ([\w\s]+)(=|!=)([\w\s]+))*

答案 2 :(得分:1)

描述

为什么不简化你的表达以完全匹配你正在寻找的东西?

!?=|(?:or|and)|\b(?:(?!or|and)[\w\s])+\b

enter image description here

实施例

Live Demo将鼠标悬停在文字区域的蓝色气泡上,以确切了解匹配的内容

示例文字

i= 2 or i =1234 and k!=4 

找到匹配

[0][0] = i
[1][0] = =
[2][0] = 2 
[3][0] = or
[4][0] =  i
[5][0] = =
[6][0] = 1234 
[7][0] = and
[8][0] =  k
[9][0] = !=
[10][0] = 4

答案 3 :(得分:0)

括号中的所有内容都会生成一个捕获组,您可以稍后通过索引访问该组。但是您可以创建不需要非捕获的组:(?: ... ),然后在Matcher.group(int)处不会考虑它。