java中的正则表达式
java中的正则表达式内容比较多又比较杂,记录下常用的。
用到的包是java.util.regex包里面只有两个类 :pattern、matcher和一个异常(runtimeexception)类。
典型的调用顺序是:
Pattern p = Pattern.compile
("a*b");
Matcher m = p.matcher
("aaaaab");
boolean b = m.matches
();
其中:Pattern将正则表达字符串编译封装,然后调用matcher函数返回一个存放了结果的Matcher匹配器,Matcher里面有很多的方法,根据要求的不同可以返回不同的结果,而matches是全部匹配,返回布尔值。
匹配:
x : 字符
\\ : 反斜线
\0XX : 八进制的开头XX
\xhh : 16进制的开头hh
字符类:
[abc] : a或b或c
[^abc] : 除了abc的任何字符
[a-zA-Z] : a到z或者A到Z,包含两端。
[a-d[m-p]] : a到d或m到p
[a-z&&[def]] : d 或 e 或 f
[a-z&&[^bc]] : a到z但是不包含bc
[a-z&&[^m-p]] : a到z但是不包含m到p
预定义字符类:
. : 任何字符
\d : 数字[0-9]
\D : 非数字
\s : 空白字符
\S : 非空白字符
\w : 单词字符[a-zA-Z_0-9]
\W : 非单词字符
边界匹配:
^ : 行的开头
$ : 行的结尾
\b : 单词边界
greedy数量词
X? : 一次或零次
X* : 零次或多次
X+ : 一次或多次
X{n} : 恰好n次
X{n,} : 至少n次
X{n,m} : 至少n次,但是不超过m次,两面都包含.
反斜线、转义的引用
反斜线( \ )用于转义,\X : 将字面转义,在不表示转义构造的任何字符前使用反斜线都是错误的;他们是为将来扩展正则表达式语言保留的.因此使用的时候要注意,如果是表示转义的字符,则用一个反斜线,如果是用正则表达式中本来就有的反斜线,应该用两个\\表示转义后的一个\.
比如:
1 String str1 = ".123";
2 String str2 = "zhang.wang.li.zhao";
3
4 SOP.sop(str1.matches("\\.[1-9]*"));
5 String[] arr = str2.split("\\.");
6 for(String s : arr){
7 SOP.sop(s);
8 }
组和捕获
(....) 表示一个组,捕获组可以通过从左到右计算开括号来编号,组零始终表示整个代表式. 之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列.组的编号出现的第一个左括号为第一组,通过\1来调用第一组。
例如:
1 String str1 = "aba";
2 SOP.sop(str1.matches("(a(b)?)+"));
3
4 String str2 = "asfdadasdadiohggqp";//去掉形如“XaX”的
5 String[] arr = str2.split("(.)a\\1");//通过\1调用第一组
6 for(String s : arr){
7 SOP.sop(s);
8 }
在Matcher中,find为查找是否有匹配的,group为按照find的结果写出对应的组,0组为整个匹配。reset为重置匹配器。
1 Pattern p = Pattern.compile("\\w(\\d)");
2 Matcher m = p.matcher("asa9c8eet99r");
3 while(m.find()){
4 SOP.sop(m.group(1));//这时候是打印第一组,也就是数字那组。
5 }
最后附上在入学测试的时候,用正则表达式解决的一道题目:编写程序获取已知文件的扩展名. 注意: abc.txt的扩展名是txt, abc.java.txt的扩展名也是txt。
1 import java.io.File;
2 import java.util.regex.*;
3
4 public class TestRegex2 {
5 public static void main(String[] args ){
6 File f = new File("c:/aa/aas/abc.txt.java.com");
7 System.out.println(getName(f));
8 }
9 static String getName(File f){
10 String name = f.getAbsolutePath();
11 System.out.println(name);
12 Pattern p = Pattern.compile("\\.[a-zA-Z]*$");//假定后缀名只能为字母
13 Matcher m = p.matcher(name);
14 String result = "";
15 while(m.find()){
16 result = m.group();
17 }
18 return result;
19 }
20 }