正則表達式中的貪婪模式和非貪婪模式是指量詞匹配時的兩種不同匹配方式,它們的區(qū)別在于匹配時的優(yōu)先級和匹配的范圍。
在貪婪模式下,匹配器盡可能多地匹配符合要求的字符,直到不能再匹配為止。例如,正則表達式 a.*b 在匹配字符串 "abbcab" 時,會匹配整個字符串 "abbcab",而不是期望的 "ab"。
在非貪婪模式下,匹配器盡可能少地匹配符合要求的字符,直到滿足要求為止。例如,正則表達式 a.*?b 在匹配字符串 "abbcab" 時,只會匹配到第一個 "ab",而不是整個字符串。
在正則表達式中,使用 ? 后綴可以將量詞從貪婪模式切換為非貪婪模式。例如,*? 表示非貪婪的零次或多次匹配,而 +? 表示非貪婪的一次或多次匹配。
總的來說,貪婪模式和非貪婪模式的區(qū)別在于匹配時的優(yōu)先級和匹配的范圍,選擇合適的模式取決于具體的匹配需求。如果需要盡可能多地匹配字符,就應該使用貪婪模式;如果需要盡可能少地匹配字符,就應該使用非貪婪模式。
假設有一個字符串 "abbbc",要用正則表達式匹配其中的子串 "ab+c",其中 + 表示至少一個 b。
使用貪婪模式時,可以使用正則表達式 "ab+c",這個表達式會匹配整個字符串 "abbbc"。
String str = "abbbc";
Pattern pattern = Pattern.compile("ab+c");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); // 輸出 "abbbc"
}
使用非貪婪模式時,可以在量詞后面添加一個問號,使用正則表達式 "ab+?c",這個表達式會匹配到第一個 "abbc" 子串。
String str = "abbbc";
Pattern pattern = Pattern.compile("ab+?c");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group()); // 輸出 "abbc"
}
可以看到,貪婪模式和非貪婪模式的區(qū)別在于匹配的范圍,前者匹配整個字符串,后者只匹配到第一個符合要求的子串。