使用Matcher.find()时IndexOutOfBoundsException

时间:2014-06-06 17:31:04

标签: java regex

这个Java程序在尝试调用group(1)时向我显示IndexOutOfBoundsException。如果我将1替换为0,则会打印整行。我该怎么办?

Pattern pattern = Pattern.compile("<abhi> abhinesh </abhi>");
Matcher matcher = pattern.matcher("<abhi> abhinesh </abhi>");
if (matcher.find())
    System.out.println(matcher.group(1));
else
    System.out.println("Not found");

3 个答案:

答案 0 :(得分:2)

索引从0开始,因此请使用matcher.group(0)

修改:要匹配代码之间的文字,请使用此正则表达式<abhi>(.*)<\\/abhi>

答案 1 :(得分:1)

这篇文章可能会对你的问题有所了解。 Confused about Matcher Group

简而言之,您还没有定义任何正则表达式分组来引用备用组。您只有完整匹配的字符串。

如果你尝试添加一个分组的正则表达式来解析xml,你会注意到0有完整的字符串,1有开始标记,2有值,3有结束标记。

Pattern pattern = Pattern.compile("<([a-z]+)>([a-z ]+)</([a-z]+)>");
Matcher matcher = pattern.matcher("<abhi> abhinesh </abhi>");

if (matcher.find()){
    System.out.println(matcher.group(0));//<abhi> abhinesh </abhi>
    System.out.println(matcher.group(1));//abhi
    System.out.println(matcher.group(2));// abhinesh 
    System.out.println(matcher.group(3));//abhi
}else{
    System.out.println("Not found");
}

答案 2 :(得分:0)

试试这个正则表达式:

<abhi>(.*)<\\/abhi>

您所关注的文本将存储在第一个捕获组中。

示例:

    String regex = "<abhi>(.*)<\\/abhi>";
    String input = "<abhi>foo</abhi>";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    if (m.find()) {
        System.out.println(m.group(1));
    }