2010-10-18 2 views
1

У этого regex есть одна или две группы?

Я пытаюсь получить доступ к bookTitle, используя вторую группу, но получаю сообщение об ошибке:

Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+'(.*)'\\s*$"); 
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'"); 
String author = matcher.group(1).trim(); 
String bookTitle = matcher.group(2).trim(); 

ответ

3

Есть две группы, но ошибка в том, что ничего не делается с совпадением.
Существует исключение IllegalStateException при попытке получить первую группу по адресу matcher.group(1).
Должен быть вызван один из методов matches, lookingAt или find.
Это должно сделать:

Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+'(.*)'\\s*$"); 
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'"); 
if (matcher.matches()) { 
    String author = matcher.group(1).trim(); 
    String bookTitle = matcher.group(2).trim(); 
    ... 
} else { 
    // not matched, what now? 
} 
4

две группы - ' не специальный символ в регулярных выражений. Какая ошибка вы получаете?

Кроме того, они НЕ с нулевой базой. Из javadoc:

Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group().

+1

Просто проверил ваше регулярное выражение на моем компьютере, и оно работает для меня –

2

Добавьте один из следующих вопросов, прежде чем задавать группы.

matcher.find(); 
matcher.maches(); 

Как это работает:

A matcher is created from a pattern by invoking the pattern's matcher method. Once created, a matcher can be used to perform three different kinds of match operations:

The matches method attempts to match the entire input sequence against the pattern.

The lookingAt method attempts to match the input sequence, starting at the beginning, against the pattern.

The find method scans the input sequence looking for the next subsequence that matches the pattern.

Источник: Java Api

Я лично рекомендую удалить несколько пробелов, а затем разделить и отделка - альт простой, протестировано и работает.

Попробуйте это:

String s = "William   Faulkner - 'Light In August'"; 
    String o[] = s.replaceAll("\\s+", " ").split("-"); 
    String author = o[0].trim(); 
    String bookTitle = o[1].trim(); 

Если бы:

System.out.println(author); 
    System.out.println(bookTitle); 

Тогда результат будет:

William Faulkner 
'Light In August' 
1

Проблема заключается в том, что класс Matcher, кажется ленивым: он на самом деле не откладывает оценку до матчей() называется методом. Попробуйте это вместо

Pattern pattern = Pattern.compile("^\\s*(.*)\\s+-\\s+'(.*)'\\s*$"); 
Matcher matcher = pattern.matcher("William Faulkner - 'Light In August'"); 

if (matcher.matches()) { 
    String author = matcher.group(1).trim(); 
    String bookTitle = matcher.group(2).trim(); 

    System.out.println(author + "/" + bookTitle); 
} 
else { 
    System.out.println("No match!"); 
} 

Вы также можете изменить группы к (. +), Чтобы убедиться, что вы не будете получать книги с пустыми авторов/названия.

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