昨天第一次在Java上用正则表达式。由于以前在C#和Python上都用过很多次,本以为能够简单类比到Java中来,但是实际过程着实很艰辛。
以 Java正则表达式 Java正则表达式入门 Java正则表达式规则 Java正则表达式简介 等关键词搜索出来的都指向一篇排版又烂,又说不清楚的东西!!看了半天没看懂,后来不得不重新把那本O‘Reilly的《精通正则表达式》下下来在看了遍,才明白其实就是3句话的事情。
因此为了让后人不重蹈我的负责,我总结一下正则表达式在Java中的用法。当然面对的是像我一样,有其他熟练编写正则表达式的程序员,但是不晓得如何在Java中Implement。
首先说明:
Java中的RegExp不支持命名捕获!!!!!对于我们这些被.NET宠惯的程序员来讲真是不可理喻!(当然在最近发布的Java7之后才刚刚支持起来)只能老老实实的数括号来捕获……
然后说明用法,一段小程序,看了就懂:
import java.util.regex.*;
....
String strPat = "\\d{1,2}"; // Regular Expression Pattern
String strToMatch = "aa12bb223cc33"; // String to be matched
/* 重点 Pattern类和Matcher类*/
Pattern regPat = Pattern.compile(strPat); //工厂模式给你预编译一个NFA正则表达式识别器
Matcher m = regPat.matcher(strToMatch); //获得这个识别器的matcher对象
while(m.find()){
//调用m.find()方法,判断并遍历输出所有匹配
//此例中依次会输出:12,22,3, 33
System.out.println(m.group());
}
看到这里相信大家都已经明白了,关键就是两个类Pattern和Matcher,和.find()方法,然后用.group()方法获得值。
稍微再详细说明一下,Matcher对象的.group()方法有一个.group(int GroupID)的重载,你猜得没错,这就是和其他一样,去获得捕获了的值中指定括号里面的值。如果不传参数直接调用.group()则直接把本次匹配(当然调用.find()方法会自动从当前匹配位置往后继续搜索下一次匹配)了的字符串整体返回。如果正则pattern里面没有括号,你调用.group(int)会报错哦~,注意int从1开始而不是0,就是第1、2、3个括号就是.gourp(1)、.group(2)和.group(3)
其实还有更无聊的。。就是Matcher对象还有.start()和.end()方法,目的是返回本次匹配的字符串在input String中的起始终止位置,当然这一般情况下没.group()方便……我就不赘述了
更详细的,请看O'Reilly出版社的《精通正则表达式(第三版)》Jeffrey.E.F.Friedl,有中文版,家中常备一本吧~ 这本书前面讲原理,什么DFA NFA啊,如何打磨你的表达式更加高效。然后后面部分就是各个语言的参考手册,非常方便,有Perl, C#, Java, Ruby和Python,强烈推荐