Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式组匹配返回错误的值_Java_Regex - Fatal编程技术网

Java 正则表达式组匹配返回错误的值

Java 正则表达式组匹配返回错误的值,java,regex,Java,Regex,在上面的输入文本中,正则表达式匹配,但是有一种情况,JKL可以是带有空格的单词,比如“jklmno”,所以我使用的正则表达式是可选的 Regex= "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))?))?(\\s+(\\S+))?\\s*"; input= " 1 ABC DEF GHI JKL PQR "; 当得到组时,我得到了错误的值,即 (\\s+(\\S+))? G6应该是

在上面的输入文本中,正则表达式匹配,但是有一种情况,JKL可以是带有空格的单词,比如“jklmno”,所以我使用的正则表达式是可选的

Regex=
 "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))?))?(\\s+(\\S+))?\\s*";

input= "    1  ABC    DEF  GHI   JKL   PQR   ";
当得到组时,我得到了错误的值,即

(\\s+(\\S+))?

G6应该是唯一的JKL或JKL MNO,当MNO出现时,请你找出我做错了什么。

如果
PQR
是强制性的,删除
(\\s+(\\s+)中的最后一个
就可以了

这是因为正则表达式是贪婪的,所以如果最后一部分是可选的(这就是问题所在),则第8组需要
PQR

完整的正则表达式应为:
“^s+(\\s+)\\s+(\\s+)\\s+(\\s+)\\s+(\\s+)(\\s+(\\s+)))?(\\s+(\\s+))\\s*”

您观察到的行为是正则表达式所期望的。捕获组以组的开始部分开始,以结束部分结束。如果捕获组a包含捕获组B,则a将包含所有B

那是为了

(\\s+(\\s+(\\s+(\\s+))?

匹配

G1: 1 G2: ABC G3: DEF G4: GHI **G6: JKL PQR** G8:PQR
JKL PQR 第一组将是JKL PQR JKL PQR JKL PQR JKL PQR PQR 第二组将是JKL PQR JKL PQR JKL PQR JKL PQR PQR 第三组是PQR JKL PQR JKL PQR JKL PQR PQR 第四组是PQR

JKL PQR JKL PQR JKL PQR PQR 如果您希望JKL成为一个组,您可以使用捕获组和非捕获组的组合,例如:

(?:\\s+(?:(\\s+)(:\\s+(\\s+))?


然后,第1组将是
JKL
,第2组将是
PQR
,发生的情况是,
部分的内部
(\\s+(\\s+)
)(\\s+(\\s+))
读取
PQR
,而regex的最后一部分
(\\s+(\\s+)
是可选的,最后没有读取任何内容

将最后一部分设置为非可选将解决此问题。但是,如果不打算捕获,可以避免使用太多的捕获组,例如,可以将空格设为非捕获-
(?:\\s+

因此,您可以将正则表达式更改为:

PQR 请注意此处关注的部分:

String str = "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(\\S+(?:\\s+\\S+)?))?(?:\\s+(\\S+))\\s*";

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

我想您需要的是:

(?:\\s+(\\S+(?:\\s+\\S+)?))?
该模式使用不情愿(非贪婪)的量词
。这意味着组7仅在必要时匹配

“MNO”
缺失时,组7根本不匹配。组6仅包含
“JKL”

如果您使用字符串锚定的末端,您将强制组7匹配
“MNO”
,即使该组是可选的,带有不情愿的量词
。第6组包含
“JKL MNO”

如果没有不情愿的量词,因为模式是从左到右计算的,
“PQR”
将由组7匹配(因为量词
默认是贪婪的),而组9将不匹配,因为它是可选的

注意:如果没有无用的捕获组,您可以编写:

^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))??))?(\\s+(\\S+))?\\s*$

与其使用令我目不转睛的正则表达式,我宁愿选择拆分:

^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(?:(\\S+)(?:\\s+(\\S+))??))?(?:\\s+(\\S+))?\\s*$
toks.length必须至少为4,以便我们有
toks[0]
toks[3]
。现在:

  • toks.length==5:这应该是“JKL”
  • toks.length==7:我们在toks[4]和toks[5]中有“v”,在toks[6]中有PQR
那么toks.length==6呢?可选的“MNO”比可选的“PQR”强还是相反?无论哪种情况,您都可以更轻松地使用字符串[]及其长度来决定


(我知道“JKL”和“MNO”之间的空格数会以这种方式丢失。如果它真的很重要,可以通过很小的努力从原始字符串中检索。)

PQR部分也是可选的吗?是的。PQR、MNO或JKL MNO是可选的。您将其设置为强制性的。其中,JKL PQR或JKL MNO PQR是可选的。:)还是不明白哪一部分是完全可选的。。我理解,比如-
JKL
是强制性的,
MNO
是可选的,
PQR
是强制性的。这是正确的要求吗?不,1 ABC DEF GHI是强制性的,JKL MNO PQR是可选的,其中JKL MNO是带空格的字,它只能是JKL或JKL MNO。谢谢Rohit,我得到了它^\\s+(\\s+)\\s+(\\s+)\\s+(\\s+)\\s+(\\s+)(\\s+(\\s+)(?:\\s+\\s+)))(?:\\s+(\\s+)))\\s*