我正在编写一个关于正则表达式的非常简单的示例代码,但无法使用group
。
正则表达式为:rowspan=([\\d]+)
输入字符串为:<td rowspan=66>x.x.x</td>
我在在线正则表达式引擎上测试它,显然可以捕获组66
,请参阅下面的快照:
基于javadoc,
组零表示整个模式,因此表达式m.group(0)为 相当于m.group()。
所以我认为应该有两个小组,小组0应该是rowspan=66
,小组1应该是66
。但是,我从下面的代码中得到的只是前者。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String args[]){
String input = "<td rowspan=66>x.x.x</td> ";
String regex = "rowspan=([\\d]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if(matcher.find()){
for(int i = 0; i < matcher.groupCount(); i++){
System.out.println(matcher.group(i));
}
}
}
}
输出结果为:
rowspan=66
提前感谢您的帮助。
答案 0 :(得分:1)
我认为代码的问题与理解Matcher#groupCount
方法的作用有关。来自Javadoc:
返回此匹配器模式中的捕获组数。 组0表示按惯例的整个模式。它不包含在此计数中。
换句话说,假设您有一个捕获组,您的for
循环只会迭代一次。但是你打印的是第一组,这是整个模式:
for (int i=0; i < matcher.groupCount(); i++) {
System.out.println(matcher.group(i));
}
相反,只需在匹配时进行迭代,然后访问所需的组。我没有看到对捕获组进行硬编码的问题很多,因为如果发生了匹配,那么根据定义,匹配中的捕获组也应该存在。
String input = "<td rowspan=66>x.x.x</td> ";
String regex = "rowspan=(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
}
注意:你的模式看起来也有点奇怪。如果您想通过\\d
匹配一个数字,那么您也不必将其添加到字符类中。因此,我在代码中使用了模式rowspan=(\\d+)
。
答案 1 :(得分:1)
我一直是正则表达式的命名组的粉丝,Java通过特殊的组构造(?<name>)
支持这一点。这样可以更轻松地检索正确的组,如果稍后在表达式中添加另一个组,则不会搞砸。它也有副作用,它消除了对matcher.groupCount()
的任何混淆。
将正则表达式更改为rowspan=(?<rowspan>[\\d]+)
您的代码:
public class Test {
public static void main(String args[]){
String input = "<td rowspan=66>x.x.x</td> ";
String regex = "rowspan=(?<rowspan>[\\d]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if(matcher.find()){
System.out.println("Entire match: " + matcher.group());
System.out.println("Row span: " + matcher.group("rowspan"));
}
}
}
你会得到:
Entire match: rowspan=66
Row span: 66
答案 2 :(得分:0)
尝试
for(int i = 0; i <= matcher.groupCount(); i++){
System.out.println(matcher.group(i));
}
matcher.groupCount()
为1
,因此如果您使用<
,则只会对索引0
进行迭代。