先看看整个字符串是否存在匹配,如果未发现匹配,则去掉字符串中的最后一个字符,再次尝试匹配,如果还是未发现匹配再去掉最后一个字符,循环往复直到发现一个匹配或者字符串不剩任何字符串。
简单量词都是贪婪量词。
先看看字符串的第一个字母是否存在匹配,如果未发现匹配,则读入下一个字符,再次尝试匹配,如果还是未发现匹配则再读取下一个字符,循环往复直到发现一个匹配或者整个字符串都检查过也没有发现匹配。
惰性匹配和贪婪匹配的工作方式正好相反。
只尝试匹配整个字符串。如果整个字符串不匹配,则不做进一步。
意思就是只做贪婪匹配的第一步。
举个例子:”[email protected]”
(1)当regex=”\w++@”的时候
经过第一次贪婪匹配,\w+匹配出的应该是”123456789”,然后再加上”@”,所以得出期望匹配到的字符串为”123456789@”。故匹配成功。
(2)当regex=”\w++3”的时候
经过第一次贪婪匹配,\w+匹配出的应该是”123456789”,然后再加上”3”,所以得出期望匹配到的字符串为”1234567893”。故匹配失败。
贪婪量词 | 惰性量词 | 支配量词 | 描述 |
---|---|---|---|
* | *? | *+ | 可以不出现,也可以出现任意次 |
? | ?? | ?+ | 可以出现0次或1次 |
+ | +? | ++ | 至少出现1次或以上 |
{n} | {n}? | {n}+ | 有且只能出现n次 |
{n,m} | {n,m}? | {n,m}+ | 至少出现n次,至多出现m次 |
{n,} | {n,}? | {n,}+ | 至少出现n次或以上 |
public static void main(String[] args) {
// String appendStr = "m"; //["com", "com", null]
String appendStr = "@"; //["123456789@", "123456789@", "123456789@"]
// String appendStr = "3"; //["123", "123", null]
// String appendStr = ""; //[{"123456789","qq","com"}, {"1","2","3","4","5","6","7","8","9","q","q","c","o","m"}, {"123456789","qq","com"}]{"1","2","3","4","5","6","7","8","9","q","q","c","o","m"}, {"123456789","qq","com"}]
String input = "[email protected]";
/** 贪婪匹配 */
String greedyMatchRegex = "\\w+" + appendStr;
Pattern greedyMatchPattern = Pattern.compile(greedyMatchRegex);
Matcher greedyMatcher = greedyMatchPattern.matcher(input);
System.out.println("贪婪匹配");
while(greedyMatcher.find()) {
System.out.println(greedyMatcher.group());
}
/** 惰性匹配 */
String lazyMatchRegex = "\\w+?" + appendStr;
Pattern lazyMatchPattern = Pattern.compile(lazyMatchRegex);
Matcher lazyMatcher = lazyMatchPattern.matcher(input);
System.out.println("惰性匹配");
while(lazyMatcher.find()) {
System.out.println(lazyMatcher.group());
}
/** 支配匹配 */
String dominantMatchRegex = "\\w++" + appendStr;
Pattern dominantMatchPattern = Pattern.compile(dominantMatchRegex);
Matcher dominantMatcher = dominantMatchPattern.matcher(input);
System.out.println("支配匹配");
while(dominantMatcher.find()) {
System.out.println(dominantMatcher.group());
}
}