您的位置:首页 > 其它

正则表达式学习笔记 之 group()和group(i)的区别

2016-05-05 21:26 363 查看
最近在做网络爬虫,需要用到正则表达式,所以学习一下,先看代码

public class Main{
public static void main(String[] args){
long start = System.currentTimeMillis();
Scanner in = new Scanner(System.in);

//开始正则
String Line = "abcdefg";
String regular = "(b)([\\s\\S]+?)(f)";
System.out.println(getRegular(Line, regular).get(0));
//结束正则

long end = System.currentTimeMillis();
System.out.println("\n用时:"+(end-start)/1000f+"秒");
}

private static List<String> getRegular(String line, String regular) {
List<String> code = new ArrayList<String>();

Pattern pattern = Pattern.compile(regular);
Matcher matcher = pattern.matcher(line);
while(matcher.find()){
code.add(matcher.group(1));//问题是这里的group的参数
}
return code;
}
}


我们的目的是获取字符串Line中的cde部分,也就是ab和fg之间的子字符串

这里不详解ab([\\s\\S]+?)fg的含义,只要知道是满足上述要求的正则表达式即可。

官方文档jdk中对group()的定义如下

String	group();		//返回由以前匹配操作所匹配的输入子序列。
String	group(int group);      //返回在以前匹配操作期间由给定组捕获的输入子序列。
int groupCount();          //返回此匹配器模式中的捕获组数。

这里的捕获组数,简单来说就是,正则表达式中有多少个括号,通过groupCount()获取捕获组数

group()和group(0)等价,就是把所有的组数一起获取,在上面的例子中,正则出来的结果是:bcdef

group(1)表示的是获取第一组,也就是第一个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:b

group(2)表示的是获取第二组,也就是第二个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:cde

group(3)表示的是获取第三组,也就是第三个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:f

那么问题来了,如果String regular = "b([\\s\\S]+?)f";

把b和f的括号去掉,结果使用groupCount()获取的组数为1,而不是之前的3。

也就是说,group(1)获取的是cde,而不是之前的b。

值得注意的是group()会出现越界问题,要注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: