3

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

([\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, or, i, =, 3, and, k, !=, 4) 如何正确提取值?

PSm.matches()返回真。

4

4 回答 4

3

您正在尝试与表达式上的正则表达式匹配...您可能想要使用解析器,因为此正则表达式(当您拥有它时)无法进一步扩展..但是可以随时扩展解析器

例如,考虑使用 antlr ( ANTLR: 有简单的例子吗? )

于 2013-08-16T07:05:25.373 回答
2

这是因为您的第三组括号(用于重复表达式的括号)使您感到困惑。尝试使用非捕获括号:

([\w\s]+)(=|!=)([\w\s]+)(?: (or|and) ([\w\s]+)(=|!=)([\w\s]+))*
于 2013-08-16T07:04:36.407 回答
1

描述

为什么不简化您的表达式以完全匹配您正在寻找的内容?

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

在此处输入图像描述

例子

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
于 2013-08-16T07:58:25.787 回答
0

括号中的所有内容构成一个捕获组,您以后可以通过索引访问它。但是您可以将不需要的组设为非捕获:(?: ... ),则不会在 处考虑Matcher.group(int)

于 2013-08-16T07:02:40.787 回答