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。
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代表的是整个表达式。
正则表达式的语法规则网上有很多,这篇不错: