JAVA中的贪婪爬取和非贪婪爬取
正则表达式匹配模式对比
贪婪爬取(Greedy Matching)
- 正则表达式:
ab+
- 行为:
b+
处于贪婪模式,会尽可能多地匹配b
字符,直至字符串末尾。 - 代码示例:
import java.util.regex.*;public class GreedyExample {public static void main(String[] args) {String text = "abbbbbbb";Pattern pattern = Pattern.compile("ab+");Matcher matcher = pattern.matcher(text);if (matcher.find()) {System.out.println("贪婪模式匹配结果: " + matcher.group());}}
}
- 输出:
贪婪模式匹配结果: abbbbbbb
- 解释:
ab+
匹配一个a
后面跟着尽可能多的b
,所以匹配了整个字符串"abbbbbbb"
。
非贪婪爬取(Non - Greedy/Lazy Matching)
- 正则表达式:
ab+?
- 行为:
b+?
是非贪婪模式,会尽可能少地匹配b
字符,仅匹配最少的一个b
(因为+
要求至少匹配一个)。 - 代码示例:
import java.util.regex.*;public class NonGreedyExample {public static void main(String[] args) {String text = "abbbbbbb";Pattern pattern = Pattern.compile("ab+?");Matcher matcher = pattern.matcher(text);if (matcher.find()) {System.out.println("非贪婪模式匹配结果: " + matcher.group());}}
}
- 输出:
非贪婪模式匹配结果: ab
- 解释:
ab+?
匹配一个a
后面跟着最少的b
字符。由于+
要求至少一个b
,所以只匹配了"ab"
。
贪婪与非贪婪模式对比
模式 | 正则表达式 | 匹配结果(字符串 "abbbbbbb") | 说明 |
---|---|---|---|
贪婪模式 | ab+ | abbbbbbb | 匹配 a 后所有 b ,直到末尾 |
非贪婪模式 | ab+? | ab | 匹配 a 后最少的一个 b |
扩展示例:多个匹配
- 贪婪模式(
ab+
):
import java.util.regex.*;public class GreedyMultiExample {public static void main(String[] args) {String text = "abbbbbbb abbb";Pattern pattern = Pattern.compile("ab+");Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("贪婪模式: " + matcher.group());}}
}
- 输出:
贪婪模式: abbbbbbb
贪婪模式: abbb
-
解释:每次匹配时,
ab+
都会尽量匹配最多的b
。 -
非贪婪模式(
ab+?
):
import java.util.regex.*;public class NonGreedyMultiExample {public static void main(String[] args) {String text = "abbbbbbb abbb";Pattern pattern = Pattern.compile("ab+?");Matcher matcher = pattern.matcher(text);while (matcher.find()) {System.out.println("非贪婪模式: " + matcher.group());}}
}
- 输出:
非贪婪模式: ab
非贪婪模式: ab
- 解释:每次匹配时,
ab+?
只匹配一个a
和最少的一个b
。
总结
- 贪婪模式(如
ab+
):尽可能匹配最多的b
,适合需要捕获最大范围的场景。 - 非贪婪模式(如
ab+?
):尽可能匹配最少的b
,适合需要精确匹配最小单元的场景。在"abbbbbbb"
示例中,贪婪模式匹配整个字符串,非贪婪模式只匹配"ab"
。