2014-11-07 3 views
0

Я просто пытаюсь захватить строку, окруженную статическим текстом. Я проиллюстрирую пример. Вот строка, я работаю с ...Извлечение группы захвата с использованием Regex

String idInfo = "Any text up here\n" + 
       "Here is the id\n" + 
       "\n" + 
       "?a0 12 b5\n" + 
       "&Edit Properties...\n" + 
       "And any text down here"; 

Или в довольно печати ...

Any text up here 
Here is the id 

?a0 12 b5 
&Edit Properties... 
And any text down here 

И я использую следующий код, чтобы попытаться напечатать идентификационный номер .. .

Pattern p = Pattern.compile("Here is the id\n\n\?[a-z0-9]{2}([a-z0-9]{2}){2}\n&Edit Properties...); 
Matcher m = p.matcher(idInfo); 
String idNum = m.group(1); 
System.out.println(idNum); 

И я хочу, чтобы просто вывести идентификационный номер, поэтому выход я хочу для этого примера ...

a0 12 b5 

Однако, когда я запускаю свой код, я получаю исключение «Нет соответствия». Что я делаю не так? Есть ли более простой и элегантный способ решения?

ответ

2

Перед тем, как использовать его, вы должны указать Matcher find. Поэтому вызывается m.find() (или m.matches() в зависимости от вашей цели) перед доступом к m.group(1);. Также проверьте, действительно ли найден матч (если m.find() перенастроен true), чтобы убедиться, что группа 1 существует.

Другое дело, что строка, представляющая ваше регулярное выражение, неверна. Если вы хотите избежать ? в regex, вам нужно написать \ как два "\\", потому что \ является специальным символом в String (используется, например, для создания \n), который также нуждается в экранировании.

Последнее, что вы указали себе в комментарии, состоит в том, что ([a-z0-9]{2}) не поставил бы матч a0 12 b5 в группе 1. Чтобы решить эту проблему, нам нужно окружить [a-z0-9]{2}([a-z0-9]{2}){2} в круглых скобках.

Так что попробуйте, может быть

Pattern p = Pattern.compile("Here is the id\n\n\\?([a-z0-9]{2}([a-z0-9]{2}){2})\n&Edit Properties..."); 
Matcher m = p.matcher(idInfo); 

if (m.find()) {//or while(m.find()) 
    String idNum = m.group(1); 
    System.out.println(idNum); 
} 
+0

Ваш код отсутствует скобки для группы захвата вокруг ID тоже. Обнаружил это при тестировании. Я считаю, что это должно быть «Вот id \ n \ n \\? ([A-z0-9] {2} ([a-z0-9] {2}) {2}) \ n & Изменить свойства ... " верный? – user2150250

+0

@ user2150250 Да, вы правы. Я пропустил, что мой код не возвращал результат, который вы описали в своем вопросе. Исправлено. – Pshemo

Смежные вопросы