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
当 MNO 存在时,G6 应该只是 JKL 或 JKL MNO 作为一个词,请你弄清楚我做错了什么。
最佳答案
您观察到的行为是正则表达式的预期行为。捕获组以该组的左括号开始,以其结束括号结束。如果捕获组 A 包含捕获组 B,则 A 将包含所有 B。
那是为了
(\\s+(\\S+(\\s+(\\S+))?))?
匹配
JKL PQR
第 1 组将是
JKL PQR第 2 组将是
JKL PQR第 3 组将是
PQR第 4 组将是
PQR
如果您只想将 JKL 作为一个组,您可以结合使用捕获组和非捕获组,例如:
(?:\\s+(?:(\\S+)(?:\\s+(\\S+))?))?
那么组 1 将是 JKL
,组 2 将是 PQR
。
关于java - 正则表达式组匹配返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305701/