在JDK 1.4中,Java增加了對正則表達式的支持。
java與正則相關的工具主要在java.util.regex包中;此包中主要有兩個類:Pattern、Matcher。
下面先說一下Pattern類:
public final class Pattern implements java.io.Serializable
Pattern類由final修飾,可知其不可被繼承,代理模式(java23種常用設計模式之一)類,正則表達式的編譯表示形式。
注意:此類的實例是不可變的,可供多個並發線程安全使用。
代理模式簡單的理解就是有一群人只會說話,但在這群人中有些人會唱歌,所以要添加代理類唱歌。但如果要在原先的實現類加上唱歌的方法就會讓代碼重用性低,耦合性高。這時用代理的方法則很好的解決了這個問題。
(引用網上例子)假設有一個Italk接口,有空的方法talk()(說話),所有的OnlyTalk對象都實現(implements)這個接口,實現talk()方法,前端有很多地方都將OnlyTalk實例化,執行talk方法,后來發現這些前端里有一些除了要說話以外還要唱歌(sing),那么我們既不能在Italk接口里增加sing()方法,又不能在每個前端都增加sing方法,我們只有增加一個代理類TalkSing,這個代理類里實現talk和sing方法,然后在需要sing方法的客戶端調用代理類即可,代碼如下:
1 interface Italk 2 { 3 4 public void talk(String st); 5 } 6 7 //Italk實現類 8 class OnlyTalk implements Italk 9 { 10 public String name; 11 public int age; 12 public String getName() { 13 return name; 14 } 15 public void setName(String name) { 16 this.name = name; 17 } 18 public int getAge() { 19 return age; 20 } 21 public void setAge(int age) { 22 this.age = age; 23 } 24 public OnlyTalk(String name,int age) 25 { 26 this.name=name; 27 this.age = age; 28 } 29 30 public void talk(String s) { 31 // TODO Auto-generated method stub 32 System.out.println(s+": 我的名字是:"+name+",我的年齡是:"+age); 33 } 34 35 36 } 37 38 //聊天&唱歌,代理類 39 class TalkSing implements Italk 40 { 41 OnlyTalk talker; 42 public String song; 43 public TalkSing(OnlyTalk talker) 44 { 45 this.talker=talker; 46 } 47 public void talk(String ss) 48 { 49 talker.talk(ss); 50 } 51 public void talk(String ss,String song) 52 { 53 talker.talk(ss); 54 sing(song); 55 } 56 private void sing(String song) 57 { 58 System.out.println("我唱的是"+song+"歌"); 59 } 60 } 61 //應用端 62 public class SingTalk { 63 64 public static void main(String[] args) { 65 // TODO Auto-generated method stub 66 67 OnlyTalk people = new OnlyTalk("華為",20); 68 people.talk("沒有代理"); 69 System.out.println(); 70 TalkSing peopleplus = new TalkSing(people); 71 peopleplus.talk("添加代理", "好運來"); 72 } 73 74 }
獲得Pattern實例方法,Pattern構造方法是私有的,因此不能通過new創建實例。
//Pattern構造器: private Pattern(String p, int f) { pattern = p; flags = f; // Reset group index count capturingGroupCount = 1; localCount = 0; if (pattern.length() > 0) { compile(); } else { root = new Start(lastAccept); matchRoot = lastAccept; } }
由下面方法可得Pattern實例,利用compile()返回Pattern實例:Pattern pattern = Pattern.compile(String regex);
方法一: public static Pattern compile(String regex) { return new Pattern(regex, 0); } 方法二: public static Pattern compile(String regex, int flags) { return new Pattern(regex, flags); }