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+)?))?


如您所见,只有一个捕获组,足以捕获JKLJKL MNO(如果存在)。如果您还想单独捕获MNO,请将内部\\S+设置为捕获组。

关于java - 正则表达式组匹配返回错误值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28305701/

10-12 06:23