gpt4 book ai didi

java - 正则表达式中带有可选 block 的组编号

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:29:19 26 4
gpt4 key购买 nike

有没有办法让方括号中的表达式被抓到一个组中?

例如我有这样的表达:

(A(B|C)?) D (E(F|G)?)

注意可选 block (B|C)?(F|G)? 需要括号。
我对这些组中捕获的内容不感兴趣。我只想捕获完整的第一个和最后一个 block 。

但是由于可选 block ,组编号会发生变化,我无法判断 (E(F|G)?) 是第 2 组还是第 3 组。

我可以告诉表达式忽略结果组中的可选部分,以便组编号保持不变吗?或者我是否可以让可选的捕获始终出现在组中 - 即使它们为空?

最佳答案

(E(F|G)?) 将始终被捕获为第 3 组。编号由模式字符串中左括号的顺序决定,即:

(A(B|C)?) D (E(F|G)?)
^ ^ ^ ^
1 2 3 4

如果 (B|C) 没有出现在输入字符串中,则 group(2) 将返回 null,但后续组不会重新编号。

唯一不影响编号的组是非捕获组,例如

(A(?:B|C)?) D (E(?:F|G)?)
^ ^
1 2

例子:

Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)");
Matcher matcher = pattern.matcher("A D EG");
if (matcher.matches()) {
System.err.println(matcher.group(1));
System.err.println(matcher.group(2));
System.err.println(matcher.group(3));
System.err.println(matcher.group(4));
}

输出:

A
null
EG
G

关于java - 正则表达式中带有可选 block 的组编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2236593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com