Java正则表达式典型用例

正则表达式往往是网页信息提取的主要技术工具,但是网页信息提取工具包MetaSeeker的客户端软件DataScraper并没有采用该技术,而是采用DOM+XPath+XSLT。但是提取到的结果被集成到数据库或其他Web应用之前,可以采用正则表达式对提取结果进行二次过滤。例如,MettaSeeker工具包中的结构化数据对象搜索引擎SliceSearch和通用文本分类训练集管理器MetaCorpora都采用了正则表达式对特定字段进行过滤处理。

正则表达式的句法是比较不好掌握,下面是从网络上搜集的多个正则表达式的典型用例(use case),可以根据自己的需要,套用这些样例即可。当然要读懂这写典型用例,需要基本的正则表达式句法知识,可以阅读文后的参考资料。


查询

代码片段:

     String str = "abc efg ABC";
     String regEx = "a|f"; //表示a或f
     Pattern p = Pattern.compile(regEx);
     Matcher m = p.matcher(str);
     boolean rs = m.find(); 

利用find()方法,如果str中有regEx,那么rs为true,否则为false。如果想在查找时忽略大小写,则可以写成

     Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

上述片断只调用了一次m.find(),只匹配一次,如果要将输入字串中的所有匹配到的子串都匹配出来,应该将find()放在while循环中



提取

代码片段:

     String regEx = ".+\(.+)$";
     String str = "c:\dir1\dir2\name.txt";
     Pattern p = Pattern.compile(regEx);
     Matcher m = p.matcher(str);
     boolean rs = m.find();
     for(int i = 1; i <= m.groupCount(); i++){
         System.out.println(m.group(i));
     } 

利用find()方法,从字符串中提取出name.txt,提取的字符串储存在m.group(i)中,m.groupCount()表示提取到的字符串分组的数量

分组m.group(0)表示匹配到的完整子字串,m.group(n) n = 1, 2, ... 是匹配到的子字串中的各个组,而m.groupCount()是不包括group(0)的,也就是如果m.group(0)和m.group(1)都有内容,那么m.groupCount() = 1



分割

代码片段:

     String regEx = "::";
     Pattern p = Pattern.compile(regEx);
     String[] r = p.split("xd::abc::cde");

split()方法执行后,获得集合{"xd","abc","cde"},其实分割时还有更简单的方法:

     String str = "xd::abc::cde";
     String[] r = str.split("::");


替换(删除)

代码片段:

     String regEx = "a+"; //表示一个或多个a
     Pattern p = Pattern.compile(regEx);
     Matcher m = p.matcher("aaabbced a ccdeaa");
     String s = m.replaceAll("A");

   使用replaceAll()方法,用"A"替换匹配到的字符串,结果为"Abbced A ccdeA"   

如果写成空串,即可达到删除的功能,比如:

     String s=m.replaceAll("");

结果为"bbced ccde"

上面的用例是全部替换,实际上还有更多替换用例。


替换首次出现的字符

代码片断:

     Pattern pattern = Pattern.compile("正则表达式");
     Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");
     String s = matcher.replaceFirst("Java");

替换第一个符合正则的数据


多样化替换字符串

代码片断:

     Pattern pattern = Pattern.compile("正则表达式");
     Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World ");
     StringBuffer sbr = new StringBuffer();
     while (matcher.find()) {
         matcher.appendReplacement(sbr, "Java");
     }
     matcher.appendTail(sbr);

这个片断也许无法看出与replaceAll()的区别,但是使用appendReplacement和appendTail方法可以使用多个不同的替换字符串,就像[1]所说,替换字串可以是Java程序计算出来的,而不是固定的,一个很详细的例子:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement



参考资料