1.qualifier(限定符)
查看API会发现,在正则表达式构造的最后部分,有一些解释是相同的。
那么这三种表达式有什么区别呢?
Greedy(贪婪的),Reluctant(勉强的),Possessive(占有,霸道的)。一般我们常见的和使用的是Greedy类型的。
下面用例子来说一下三者的区别:
1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 3 4 5 public class RegexTest2 { 6 7 public static void main(String[] args) { 8 //Greedy 9 Pattern p=Pattern.compile(".{3,10}[0-9]"); 10 Matcher m=p.matcher("aaaa5bbbb6"); 11 if(m.find()){ 12 System.out.println("Greedy:"+m.start()+"--"+m.end()); 13 }else{ 14 System.out.println("Greedy:"+"not match!"); 15 } 16 17 //Reluctant 18 Pattern p1=Pattern.compile(".{3,10}?[0-9]"); 19 Matcher m1=p1.matcher("aaaa5bbbb6"); 20 if(m1.find()){ 21 System.out.println("Reluctant:"+m1.start()+"--"+m1.end()); 22 }else{ 23 System.out.println("Reluctant:"+"not match!"); 24 } 25 26 //Possessive 27 Pattern p2=Pattern.compile(".{3,10}+[0-9]"); 28 Matcher m2=p2.matcher("aaaa5bbbb6"); 29 if(m2.find()){ 30 System.out.println("Possessive:"+m2.start()+"--"+m2.end()); 31 }else{ 32 System.out.println("Possessive:"+"not match!"); 33 } 34 } 35 36 }
输出结果:
Greedy:0--10
Reluctant:0--5
Possessive:not match!
看到这个结果,相信很多人已经有了大概了解,下面详细讲一下过程:
Greedy是贪婪的,当它看到“.{3,10}”时,会直接吞掉十个字符,然后和整个正则表达式去匹配,这时发现不匹配,因为总共只有10个字符,而正则中的“[0-9]”没有可匹配的内容。然后它吐出最后一个字符,再次与整个正则进行匹配,发现匹配成功。
Reluctant是勉强的,懒惰的,当它看到“.{3,10}”时,会吞掉3个字符,然后与整个正则去匹配,发现第4个字符不符合要求,然后它再多吞一个字符,再次进行匹配,直到成功。
Possessive是霸道的,吞了就不会吐,而且挑多的吞,所以它直接吃掉十个字符,然后匹配,发现不成功,然后就没有然后了,not match!
2.模式简写
正则表达式有多种模式,最常用的一种模式是CASE_INSENSITIVE(字母大小写不敏感)。
在上一篇的案例一中也用到了这个模式。但是正则表达式基本可以看成一种专门的语言了,
CASE_INSENSITIVE
只是java中的一个常量值,那么正则表达式如何表示不区分大小写呢?
点开API CASE_INSENSITIVE
常量的解释,我们发现:
下面我们测试一下:
1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 3 public class RegexTStr { 4 5 public static void main(String[] args) { 6 7 Pattern p=Pattern.compile("(?i)(hello)"); 8 Matcher m=p.matcher("HeLLo"); 9 System.out.println(m.matches()); 10 11 } 12 13 }
输出结果:true
3.String中的正则表达式
在java中,正则表达式本身就是String对象,但它又是一种特殊的String,所以在有String类型参数的方法上,要多多注意是不是指正则表达式:
- String中有2个替换的方法replace()和replaceAll()。replace()接受的2个参数都是char类型,它只能替换单个字符。replaceAll()接受的2个参数都是String类型,其中第一个则是正则表达式。replaceFirst()这个方法和replaceAll()类似,第一个参数是正则,这个方法使用较少。
- String中分割字符串的方法split()中的String参数也是正则表达式。
- String中也有匹配正则表达式的方法matches()。所以如果一个正则表达式如果只和一个字符串去比较,用这个应该是最简便的。比如:"java".matches(".*")。这个和Pattern.matches(".*","java")效果相同。
- String中还有一个方法名让人产生错觉----format(),很遗憾他的参数不是正则表达式。关于这个方法以后再研究吧。
正则表达式还有很多其他的格式,但是见得很少,所以就不总结了。如果遇到了,再查吧。