正则表达式非捕获分组?:
一个使用 Java 正则表达式的具体例子,展示了 (ab)+
和 (?:ab)+
的不同:
示例 1:使用 (ab)+
(捕获分组)
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "ababab";
// 使用捕获分组
String regex = "(ab)+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
// 捕获组 1 是每个 'ab' 的匹配
System.out.println("Matched: " + matcher.group(1));
}
}
}
运行结果:
Matched: ab
Matched: ab
Matched: ab
解释:
- 在这个例子中,
(ab)+
会将每个ab
捕获为分组 1,并在每次匹配时输出ab
。 - 每个匹配的
ab
都被捕获并打印出来。
示例 2:使用 (?:ab)+
(非捕获分组)
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "ababab";
// 使用非捕获分组
String regex = "(?:ab)+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
// 这里没有捕获分组,所以直接输出匹配的字符串
System.out.println("Matched: " + matcher.group());
}
}
}
运行结果:
Matched: ababab
解释:
- 在这个例子中,
(?:ab)+
会匹配ababab
整个字符串,但由于使用了非捕获分组,它不会将ab
保存到捕获组中。 matcher.group()
只返回整个匹配的字符串,即ababab
,没有对单独的ab
进行捕获。
总结:
- 使用
(ab)+
时,每次匹配到的ab
都会被捕获并存储,可以通过matcher.group(1)
获取。 - 使用
(?:ab)+
时,匹配到的整个字符串ababab
会被匹配,但没有分组存储每个ab
,所以无法提取每个ab
。