2013-11-30 2 views
0

Привет У меня есть строка "id:2 CAT-id:9-101". Я хочу извлечь из этой строки значения id, 2 и 9. Я прочитал http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int)за пределами исключения для java Matcher

и попробовал этот код, но он бросает исключение при попытке извлечь 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; я должен использовать здесь обратные ссылки, чтобы получить идентификаторы? Я пробовал это позже, а m.find() всегда возвращал false, когда я менял регулярное выражение на "id:([0-9]+)\\$1"

+0

обратные ссылки подобны этому (если они были синтаксически правильными, что я думаю, что это не так, поскольку у вас есть обратная косая черта и знак доллара, я думаю, вы просто хотите (экранированный) обратная косая черта) заставит его соответствовать только дублированным номерам, например «id: 123123», но даже это не сработает, если вы не сделали первую группу не- жадный (например, "id: ([0-9] +?) \\ 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)

0

IndexOutOfBoundsException throws, если в шаблоне нет заданного индекса. В вашем случае нет группы 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)); 
    } 
Смежные вопросы