Java 正则表达式入门 (适合有其他语言正则表达式经验的开发人员)

昨天第一次在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,强烈推荐



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值