Java处理正则表达式

Java本身的Util包里面就有提供处理正则表达式的工具类,当然还有很多第三方正则表达式处理包,反正到目前为止,用java.util.regex就已经能满足我的需求了。示例如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Hello {
	public static void main(String[] args) {
		String regEx = "[0-9]{6}";//正则表达式 
		String html = "124595#123456123";//要检查匹配的字符串
		Pattern p = Pattern.compile(regEx);     
		Matcher m = p.matcher(html);
		System.out.println(""+m.groupCount());
		while(m.find()){ 
		    System.out.println(m.group()+" "+m.start()+" "+(m.end()-1));       
		}      	  
	}
}

 

 打印结果如下:

0
124595 0 5
123456 7 12

 这里的问题是groupCount为什么是0。group()、group(i)、groupCount到底指的是什么,网上普遍的解释:

http://hi.baidu.com/personnel/item/2a7eebbf5ccb61422bebe352 写道

 

首先弄明白Java的正则表达式中捕获组的概念,也就是以括号对“()”分割出的子Pattern,为什么要用到子模式呢?这是为了能在一次匹配中找出关心部分,例如:
input: abbc
pattern:a(b*)c
group0: a(b*)c
group1:(b*)

整个pattern是可以匹配abbc的,group()方法就是获得当前查找里面整个pattern所匹配的子序列,所以你可以通过group()找到“abbc”。

与此同时,我还对其中的b的个数感兴趣,就可以通过group1来得到关于(b*)的匹配情况,group(i)就是获得当前查找里面指定的捕获组所匹配的子序列,所以你可以通过group(0)来找到“bb”。

上面说清楚了,groupCount()的含义就很容易明白了,它并不是指在输入序列中Pattern总共匹配了多少次,而是指的捕获组的个数,当然它不对“整个pattern”计数,而只对“子Pattern”计数,如上例中groupCount()返回1,而如果我们将input改为“abbc abbc abbc”,——有三次匹配——groupCount()还是返回1。

 测试代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Hello {
	public static void main(String[] args) {
		String regEx = "t(\\d{0,3})n";//正则表达式 
		String html = "12t32nst567n";//要检查匹配的字符串
		Pattern p = Pattern.compile(regEx);     
		Matcher m = p.matcher(html);
		System.out.println(""+m.groupCount());
		while(m.find()){ 
		    System.out.println(m.group()+" "+m.start()+" "+(m.end()-1));  
		    System.out.println(m.group(1));
		}      	  
	}
}

 

 表达式查找t和n之间包含0到3个数字的字符串,结果为:

1
t32n 2 5
32
t567n 7 11
567

 可以看到groupCount为1了,同时可以看到group(i),i从1开始代表()内的子表达式,0代表的是整个表达式。

 

正则表达式的语法规则网上有很多,这篇不错:

http://fineboy.cnblogs.com/archive/2005/09/08/232410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值