正则表达式学习笔记
在看api文档时,不小心留意到这一部分的内容,那它们是什么意思呢?又有什么作用呢?
在不懂什么意思的情况下,借助了伟大的google翻译才得到这几个词的意思,Greedy是贪婪的,贪心的;Reluctant是勉强的;Possessive是占有的,所有权的;经过仔细观察又可以看出Reluctant相对Greedy是在量词后多了个?,Possessive相对Greedy是在量词后多了个+。后又了解了原来正则表达式还有贪婪模式、非贪婪模式(也叫勉强模式、懒惰模式、惰性模式)和独占模式。而Greedy就是贪婪模式的数量词,Reluctant就是非贪婪模式的数量词,Possessive就是独占模式的数量词。
各模式的特点
a. 量词
在我们写正则表达式时,默认书写的就是贪婪模式,接下来我们来看看属于贪婪模式的量词有哪些。
*,+,?,{m,n},{m,},{m}这些都是贪婪模式的量词,又叫匹配优先量词。在这些量词后添加上?就是非贪婪模式的量词,在这些量词后添加上+就是独占模式的量词。
b. 匹配规则
贪婪模式的匹配规则:尽可能的匹配最多的元素,匹配整个字符串,不满足的话回退一个接着匹配;
非贪婪模式的匹配规则:尽可能的匹配最少的元素,匹配时从第一个字符开始,不满足的话加一个字符;
独占模式的匹配规则:尽可能的匹配最多的元素,匹配整个字符串,尝试一次仅且一次匹配成功,不满足的话不回退;
1 String str = "tom is chasing jerry and tom will soon catch jerry"; 2 Pattern c1 = Pattern.compile("tom.*"); 3 Pattern c2 = Pattern.compile("tom.*?"); 4 Matcher m1 = c1.matcher(str); 5 Matcher m2 = c2.matcher(str); 6 System.out.println("m1的匹配结果;"); 7 while(m1.find()){ 8 System.out.print(m1.group()); 9 } 10 System.out.println("\r\nm2的匹配结果:"); 11 while (m2.find()) { 12 System.out.print(m2.group()+" "); 13 }
运行结果:
1 String str1 = "abbcdefbbc"; 2 Pattern c3 = Pattern.compile(".*+bbc"); 3 Matcher m3 = c3.matcher(str1); 4 System.out.println("\r\n"+m3.matches());