在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 stub32 System.out.println(s+": 我的名字是:"+name+",我的年龄是:"+age);33 }34 35 36 }37 38 //聊天&唱歌,代理类39 class TalkSing implements Italk40 {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 stub66 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); }