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 }

 

posted @ 2012-03-22 22:28  ruidge  阅读(592)  评论(0编辑  收藏  举报