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(),很遗憾他的参数不是正则表达式。关于这个方法以后再研究吧。

 

  正则表达式还有很多其他的格式,但是见得很少,所以就不总结了。如果遇到了,再查吧。