java Matcher的超出范围异常

时间:2013-11-30 01:35:00

标签: java regex

嗨,我有字符串"id:2 CAT-id:9-101"。我想从这个字符串中提取id值2和9。我看过http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int)

并尝试过这段代码,但在尝试提取9时会引发异常:

Pattern p = Pattern.compile("id:([0-9]+)");
Matcher m = p.matcher("id:2 CAT-id:9-101");

ArrayList<Integer> ids = new ArrayList<Integer>();
int index = 1;
while(m.find()) {
    String match = m.group(index);
int id = Integer.parseInt(match);
ids.add(id);
index++;
}

阅读http://docs.oracle.com/javase/tutorial/essential/regex/groups.html时我也很困惑;我应该在这里使用反向引用来获取ID吗?我稍后尝试了,当我将正则表达式更改为"id:([0-9]+)\\$1"时,m.find()总是返回false

2 个答案:

答案 0 :(得分:0)

如果模式中没有具有给定索引的捕获组,则

IndexOutOfBoundsException抛出。在您的情况下,没有组2,因此抛出异常。您应该使用group(1)获取29。在代码下面运行,

    Pattern p = Pattern.compile("id:([0-9]+)");
    Matcher m = p.matcher("id:2 CAT-id:9-101");

    ArrayList<Integer> ids = new ArrayList<Integer>();
    while (m.find()) {
        String match = m.group(1);
        System.out.println(match);
        ids.add(Integer.valueOf(match));
    }

答案 1 :(得分:0)

每次循环都需要String match = m.group(1);(不是index),因为每次运行find时,group返回的集都会重置(找到“返回在前一个匹配操作期间由给定组捕获的输入子序列“,每http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28%29