程序员不只能用字符串来表示一个正则表达式,实际上,Java语言定义了一个专门用来表示正则表达式的类,它的名称是Pattern,因此,一个Pattern类的对象当中就封装了一个经过编译的正则表达式。需要注意:这个类位于java.util. regex包下,因此在使用时需要用import关键字进行引入。
Pattern类定义了一个构造方法,但是这个构造方法是私有的,所以在程序当中不能通过new关键字来创建它的对象。程序员都是通过它的compile()静态方法来创建对象的。在调用compile方法时需要把一个字符串形的正则表达式当作参数传递到这个方法当中,例如:
Pattern p = Pattern.compile("\\d[abc]");
如果某个Pattern类的对象并不是通过compile()静态方法创建出来的,而是从其他方法中返回到程序当中的,程序员可以通过pattern()方法来获得对象中包含的那个正则表达式,所获得的这个正则表达式是以字符串的形式返回的。
使用Pattern类的对象也可以去某个字符串当中去搜索符合特定格式的目标字符串。找到目标字符串之后,程序员用Pattern类对象不能完成替换操作,这是因为Pattern类没有提供完成替换的方法。如果需要把搜索到目标字符串替换成其他内容,需要使用Matcher类,关于Matcher类的使用将会在16.4小节中讲解。但是Pattern类提供了一个split()方法能够把一个字符串用正则表达式所匹配的字符串进行分割。
Pattern类还提供了一个matches()静态方法,这个方法能够检验一个正则表达式与一个字符串是否能够完成匹配。此外,Pattern类的quote()方法能够把一个字符串形式的正则表达式加入到“特殊字符失效区”当中,最终形成一个新的字符串并返回。
实际上,16.2.5小节所介绍的匹配模式标识符在Pattern也用静态属性的形式进行了定义,每一个静态属性对应的匹配模式标识符如表16-5所示。
表16-5 Pattern中的匹配模式标识符
静态属性 | 匹配模式标识符及意义 |
CASE_INSENSITIVE | (?i) 匹配过程中忽略大小写 |
UNICODE_CASE | (?u)忽略大小写的范围扩大到整个Unicode字符集,需先设置CASE_INSENSITIVE标志 |
MULTILINE | (?m)匹配过程中把换行符(\n)也看成是一行的结尾 |
DOTALL | (?s)允许 . 匹配换行符 |
COMMENTS | (?x)忽略正则表达式中的的空白字符 |
这些静态属性可以在调用compile()静态方法时当作第二个参数传入方法中。下面的【例16_15】展示了Pattern类的使用方法。
【例16_15 Pattern类的使用】
Exam16_15.java
- import java.util.regex.*;
- public class Exam16_15 {
- public static void main(String[] args) {
- String reg = "\\d[abc]";//定义一个字符串形式的正则表达式
- String str = "xyz1Auvw2brst3copq";
- Pattern p1 = Pattern.compile(reg);
- Pattern p2 = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);//设置忽略大小写
- System.out.println("p1对应的正则表达式:"+p1.pattern());
- System.out.println("p2对应的正则表达式:"+p2.pattern());
- String[] strings1 = p1.split(str);//以p1为分割符分割str
- System.out.print("以p1为分割符分割str:");
- for(String s:strings1){
- System.out.print(s+" ");
- }
- String[] strings2 = p2.split(str);//以p2为分割符分割str
- System.out.println();//换行
- System.out.print("以p2为分割符分割str:");
- for(String s:strings2){
- System.out.print(s+" ");
- }
- System.out.println();//换行
- System.out.print("3a是否能匹配\\d[abc]:");
- System.out.println(Pattern.matches("\\d[abc]","3a"));
- System.out.print("把整个正则表达式置于特殊字符失效区内:");
- System.out.print(Pattern.quote(reg));
- }
- }
【例16_15】定义了两个Pattern对象p1和p2,但p2它们设置的匹配模式为不区分大小写。【例16_15】的运行结果如图16-15所示。
图16-15【例16_15】运行结果
从图16-15可以看出:虽然p2与p1的设置了不同的匹配模式,但它们对应的字符串形式的正则表达式却是相同的,这是因为Pattern类并不是把匹配模式当作正则表达式正文的一部分,而是把它当作了对象的一个属性。使用p1和p2分割字符串时有不同的效果,可以看出:str中的“1A”对于不能匹配p1,但由于p2设置了不区分大小写的匹配模式,“1A”能够与p2完成匹配。