嗨,我有字符串"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
答案 0 :(得分:0)
IndexOutOfBoundsException
抛出。在您的情况下,没有组2
,因此抛出异常。您应该使用group(1)
获取2
和9
。在代码下面运行,
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)