1. 贪婪量词的定义
在正则表达式中,有一类特殊的符号可以对匹配的字符串数量进行限定,例如?、*、+等等,它们被称为量词符号。其中,贪婪量词是最常见的一种。贪婪量词的作用是匹配足够多的字符,以尽可能多地满足匹配条件。比如,我们使用正则表达式 \w+
来匹配“hello world”,它将匹配到“hello”和“world”两个单词。
String str = "hello world";
Pattern pattern = Pattern.compile("\\w+");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
// 输出结果:hello、world
2. 贪婪量词的用法
2.1 基本语法
贪婪量词的基本语法是在正则表达式中添加 ? 之后缀上量词符号。例如,在贪婪量词 .*
前面添加 ? 就可以得到非贪婪量词 .*?
了。
String str = "123abc456def";
// 贪婪量词
Pattern greedyPattern = Pattern.compile("\\d.*\\d");
Matcher greedyMatcher = greedyPattern.matcher(str);
while(greedyMatcher.find()) {
System.out.println("贪婪匹配结果:" + greedyMatcher.group());
}
// 非贪婪量词
Pattern reluctantPattern = Pattern.compile("\\d.*?\\d");
Matcher reluctantMatcher = reluctantPattern.matcher(str);
while(reluctantMatcher.find()) {
System.out.println("非贪婪匹配结果:" + reluctantMatcher.group());
}
// 输出结果:
// 贪婪匹配结果:123abc456def
// 非贪婪匹配结果:123abc456
可以看到,非贪婪量词只会匹配到第一个数字和最后一个数字之间的字符,而贪婪量词则会将整个字符串全部匹配。
2.2 配合组合使用
贪婪量词在正则表达式中也可以与其他符号进行组合使用,比如可以使用括号将量词短语划分为一组,然后再对该组进行贪婪匹配。
String str = "abc123def456";
// 匹配数字组合
Pattern pattern = Pattern.compile("(\\d+)");
Matcher matcher = pattern.matcher(str);
// 遍历匹配结果
while (matcher.find()) {
System.out.println("匹配结果:" + matcher.group());
}
// 输出结果:123、456
在这个例子中,我们使用了括号将量词短语 \\d+
分为一组,然后再对该组进行贪婪匹配,最终就可以匹配到数字组合。
2.3 匹配限制
贪婪量词在匹配时可能会匹配到一些我们不想要的部分,这时候我们可以使用一些匹配限制符号来约束匹配的范围。
2.3.1 换行符匹配模式
换行符匹配模式是指我们可以通过添加 (?s)
来匹配包括换行符在内的所有字符。
String str = "hello\nworld";
// 匹配全部字符
Pattern pattern = Pattern.compile("(?s).^.*$");
Matcher matcher = pattern.matcher(str);
// 遍历匹配结果
while (matcher.find()) {
System.out.println("匹配结果:" + matcher.group());
}
// 输出结果:hello\nworld
这个例子中,我们使用了换行符匹配模式以及量词符号 .
和 *
来匹配两行文本中包含的全部字符。
2.3.2 非贪婪匹配模式
非贪婪匹配模式是指我们可以在贪婪量词后面添加 ?
符号,以获得非贪婪匹配模式。
String str = "aabbaa";
// 非贪婪匹配模式
Pattern pattern = Pattern.compile("a.+?a");
Matcher matcher = pattern.matcher(str);
// 遍历匹配结果
while (matcher.find()) {
System.out.println("匹配结果:" + matcher.group());
}
// 输出结果:aabba、aa
在这个例子中,我们匹配了字符串中以"a"开头和结尾的部分,使用非贪婪量词让正则表达式只匹配最短的匹配结果,“aabba”和“aa”。
2.3.3 正则表达式模式
正则表达式模式是指我们可以使用“|
”符号来匹配多个正则表达式模式之一。
String str = "hello world";
// 匹配所有不含a或o字符的单词
Pattern pattern = Pattern.compile("\\b[^ao\\s]+\\b");
Matcher matcher = pattern.matcher(str);
// 遍历匹配结果
while (matcher.find()) {
System.out.println("匹配结果:" + matcher.group());
}
// 输出结果:hello
在这个例子中,我们使用了正则表达式模式 [^ao\s]+
来匹配所有不含字符"a"或"o"的词语,并且只匹配英文单词。
3. 总结
贪婪量词是正则表达式中常用的量词符号之一,它的作用是尽可能多地匹配字符串。在使用正则表达式时,我们可以通过添加 ? 符号来得到非贪婪量词,或者通过添加括号将量词短语分为一组后进行匹配。此外,我们还可以使用一些匹配限制符号来约束匹配的范围,比如使用正则表达式模式进行匹配。