我正在使用这个正则表达式:
([\ 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。
答案 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
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)
处不会考虑它。