有没有办法让括号中的表达式不被捕获?
我有一个像这样的表达式:
(A(B|C)?) D (E(F|G)?)
Run Code Online (Sandbox Code Playgroud)
记下可选块(B|C)?和(F|G)?需要括号.
我对这些小组中的内容并不感兴趣.我想要的只是抓住完整的第一个和最后一个块.
但是由于可选块,组编号将改变,我无法判断是否(E(F|G)?)被捕获为组2或3.
我可以告诉表达式忽略结果组中的可选部分,因此组编号将保持不变吗?或者我可以使可选的捕获总是出现在组中 - 即使它们是空的?
fin*_*nnw 15
(E(F|G)?) 将始终作为组3捕获.编号由模式字符串中的左括号开始的顺序决定,即:
(A(B|C)?) D (E(F|G)?)
^ ^ ^ ^
1 2 3 4
Run Code Online (Sandbox Code Playgroud)
如果(B|C)输入字符串中没有出现,则group(2)返回null,但后续的组不会重新编号.
唯一不影响编号的组是非捕获组,例如
(A(?:B|C)?) D (E(?:F|G)?)
^ ^
1 2
Run Code Online (Sandbox Code Playgroud)
例:
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));
}
Run Code Online (Sandbox Code Playgroud)
输出:
A
null
EG
G
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4514 次 |
| 最近记录: |