Java 正则表达式——贪婪匹配、惰性匹配、支配匹配
2016-11-27 22:41
639 查看
简介
贪婪匹配
先看看整个字符串是否存在匹配,如果未发现匹配,则去掉字符串中的最后一个字符,再次尝试匹配,如果还是未发现匹配再去掉最后一个字符,循环往复直到发现一个匹配或者字符串不剩任何字符串。简单量词都是贪婪量词。
惰性匹配
先看看字符串的第一个字母是否存在匹配,如果未发现匹配,则读入下一个字符,再次尝试匹配,如果还是未发现匹配则再读取下一个字符,循环往复直到发现一个匹配或者整个字符串都检查过也没有发现匹配。惰性匹配和贪婪匹配的工作方式正好相反。
支配匹配
只尝试匹配整个字符串。如果整个字符串不匹配,则不做进一步。意思就是只做贪婪匹配的第一步。
举个例子:”123456789@qq.com”
(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 = "123456789@qq.com"; /** 贪婪匹配 */ 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()); } }
相关文章推荐
- Java正则之贪婪匹配、惰性匹配
- Js 正则表达式 贪婪、惰性和支配量词 (转)
- 正则表达式中贪婪和非贪婪(惰性)匹配的区别与效率问题
- Java-----正则表达式匹配模式[贪婪模式、勉强模式、占有模式]
- 正则表达式学习笔记贪婪、惰性和支配量词
- 正则表达式学习笔记(4) 贪婪、惰性和支配量词
- Java正则之贪婪匹配,惰性匹配
- Java正则之贪婪匹配,惰性匹配
- Java正则之贪婪匹配、惰性匹配
- 正则表达式 捕获组,向前引用,零宽度断言,贪婪量词,惰性量词以及支配量词
- 正则表达式学习笔记(4) 贪婪、惰性和支配量词
- javascript正则表达式 贪婪、惰性和支配量词
- 正则表达式 捕获组,向前引用,零宽度断言,贪婪量词,惰性量词以及支配量词
- 正则表达式 捕获组,向前引用,零宽度断言,贪婪量词,惰性量词以及支配量词
- 正则表达式中的贪婪、惰性、支配性的量词
- 【转】正则表达式-贪婪匹配与非贪婪匹配的效率问题
- 正则表达式的贪婪匹配(.*)和非贪婪匹配(.*?)
- 【摘抄】正则表达式的非贪婪匹配
- java中常用的匹配正则表达式实例大全
- 正则表达式的贪婪匹配问题