Regex=
"^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))?))?(\\s+(\\S+))?\\s*";
input= " 1 ABC DEF GHI JKL PQR ";
在上面的输入文本中,正则表达式匹配,但是在某些情况下,JKL可以是带有空格的单词,例如“ JKL MNO”,因此正则表达式已像可选一样被批准
(\\s+(\\S+))?
在获得小组的同时我得到了错误的价值,即
G1: 1 G2: ABC G3: DEF G4: GHI **G6: JKL PQR** G8:PQR
G6当MNO出现时,应该仅是JKL或JKL MNO一词,您能找出我在做什么错。
最佳答案
发生的是,部分(\\s+(\\S+))?
的内部(\\s+(\\S+(\\s+(\\S+))?))
读取了PQR
,而正则表达式的最后一部分-(\\s+(\\S+))?
是可选的,最终什么也没读。
将最后一部分设为非可选将解决此问题。但是,如果您不想捕获它们,可以避免使用那么多捕获组,例如,可以将空格设置为非捕获-(?:\\s+)
因此,您可以将正则表达式更改为:
String str = "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(\\S+(?:\\s+\\S+)?))?(?:\\s+(\\S+))\\s*";
注意此处关注的部分:
(?:\\s+(\\S+(?:\\s+\\S+)?))?
如您所见,只有一个捕获组,足以捕获
JKL
和JKL MNO
(如果存在)。如果您还想单独捕获MNO
,请将内部\\S+
设置为捕获组。关于java - 正则表达式组匹配返回错误值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28305701/