一個使用 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
。