Java中的正则表达式与模式匹配研究
摘要 正则表达式是代表具有特殊意义字符的字符串。在信息时代,我们从海量数据中寻找特定的信息时,正则表达式起到了至关重要的作用。正则表达式仿佛一个模板,将某个字符模式与所搜索的字符串进行匹配。在编写程序时正则表达式也起着很重要的作用,应用广泛。本文主要研究java中正则表达式的使用,及模式匹配。
关键词 正则表达式;模式匹配;Pattern类;Matcher类
正则表达式仿佛一个模板,将某个字符模式与所搜索的字符串进行匹配。在编写程序时正则表达式也起着很重要的作用,应用广泛。本文主要研究java中正则表达式的使用,及模式匹配。
1 java中的Pattern类
1.1 重要方法
1)static Pattern compile(String regex)
该静态方法通过使用类名调用,返回一个Pattern类型的对象,并且将给定的正则表达式regex编译到模式中。
举例1:Pattern p ; p=Pattern.compile(“\\\\dabcd\\\\d”);
2)Matcher matcher(CharSequence input)
使用Pattern类的对象调用该方法,返回一个Matcher类型的对象,其主要作用是用在input中待匹配的字符序列初始化匹配对象。
举例2:Matcher m;m=p.matcher(“aaa1abcd2bbb”);
3)static Boolean matches(String regex,CharSequence input)
使用类名调用该方法,判断input是否与regex正则表达式匹配。
举例3:Pattern.matches(“\\\\dabcd\\\\d”, “aaa1abcd2bbb”);
//结果返回 true。
4)String pattern()
用对象调用,返回在其中编译过此模式的正则表达式。
举例4:Pattern p = Pattern.compile(“\\\\dabcd\\\\d”);
p.pattern();
//结果返回字符串“\\\\dabcd\\\\d”。
5)String[] split(CharSequence input);
用对象调用该方法,返回一个字符串数组,数组中的每个元素都是input中被该模式对象拆分的字符串。
举例5:Pattern p = Pattern.compile(“:”);
String arry[]=p.split(“a:bcd:ef”);
//结果:arry[0]=”a”,arry[1]=”bcd”,arry[2]=”ef”。
2 Matcher类
主要方法:
1)public boolean find()
使用模式对象调用该方法,尝试查找与该模式匹配的输入序列的下一个子序列。若找到返回true,否则返回false。
举例6:Pattern p=Pattern.compile(“\\\\dabcd\\\\d”);
Matcher m = p.matcher(“12abcd3fcsd);
If(m.find()){System.out.print(“ok”);}
//m调用find()方法,找到与之匹配的子序列“2abcd3”,程序将输出“ok”。
说明:该方法始于匹配器区域的开头,如果该方法的前一次调用成功,并且没有重置,则下一次调用时从上次没有匹配的第一个字符开始。例如在上例中下一次匹配时从字符“f“处向后查找。
2)public boolean find(intstart)
使用模式对象调用该方法,该方法重置匹配器,尝试查找匹配该模式、从指定索引start处开始的输入序列的下一个子序列。
举例7:Pattern p=Pattern.compile(“\\\\dabcd\\\\d”);
Matcher m = p.matcher(“12abcd3fcsd);
If(m.find(3)){System.out.print(“ok”);}
//程序结果没有输出“ok“。将从字符”b”处查找匹配的子序列。
3)public int start()
使用模式对象调用该方法,返回以前匹配的初始索引。
4)public int end()
使用模式对象调用该方法,返回最后匹配字符之后的偏移量。
5)public String group()
使用模式对象调用该方法,返回由以前匹配操作所匹配的输入子序列。
举例8: Pattern p=Pattern.compile(“\\\\dabcd\\\\d”);
Matcher m = p.matcher(“12abcd3fcsd);
m.find();
System.out.println(m.start+”---”+m.end()+”,”+m.group())
//结果1---6,2abcd3。
6)public String replaceAll(Stringreplacement)
使用模式对象调用该方法,替换模式与给定替换字符串相匹配的输入序列的每个子序列。
举例9:Pattern p=Pattern.compile(“\\\\dabcd\\\\d”);
Matcher m = p.matcher(“12abcd3fcsd);
System.out.print(m.replaceAll(“***”));
//结果:1***fcsd。
7)public boolean matches()
使用模式对象调用该方法,尝试将整个字符串与模式匹配。若完全匹配返回true,否则返回false。
举例10:Pattern p=Pattern.compile(“\\\\dabcd\\\\d”);
Matcher m = p.matcher(“1abcd3);
Matcher m1 = p.matcher(“2abcd33”);
If(m.matches()) System.out.print(“ok”);
If(m1.matches()) System.out.print(“ok111”);
//程序结果输出 “ok“。
3 正则表达式的构造
1)代表单个字符的元字符
元字符 在正则表达式中的写法 意义
. “.” 代表任意一个字符
\\d “\\\\d” 代表0—9的任何一个数字
\\D “\\\\D” 代表任何一个非数字字符
\\s “\\\\s” 代表空格类字符:
’\’ ‘\\n’ ‘\\x0B’ ‘\\f’ ‘\\r’
\\S “\\\\S” 代表非空格类字符
\\w “\\\\w” 代表可用于标识符的字符
(不包括美元符号)
\\W “\\\\W” 代表不能用于标识符的字符
2)限定符模式
带限定符号的模式 意义 带限定符号的模式 意义
X? X出现0次或1次 X{n} X恰好出现n次
X* X出现0次或多次 X{n,} X至少出现n次
X+ X出现1次或多次 X{n,m} X出现n次至m次
4 应用举例
1)Email正则表达式的书写。
Pattern emailer = Pattern.compile(”\\\\w+([-+.]\\\\w+)*@\\\\w+([-.]\\\\w+)*\\\\.\\\\w+([-.]\\\\w+)*”);
2)电话号码正则表达式的书写。
Pattern tel = Pattern.compile(”\\\\d{3,4}-\\\\d{7,8}|\\\\d{11}”);
参考文献
[1]java大学实用教程.清华大学出版社.
[2]java 2 编程思想.