Есть ли в этом регулярном выражении одна или две группы? "^ \\ с * \\ s + (*.?) - '(. *)' \\ s + \\ с * $" - PullRequest
1 голос
/ 19 октября 2010

Имеет ли это 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();

Ответы [ 4 ]

4 голосов
/ 19 октября 2010

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

Кроме того, они НЕ начинаются с нуля. Из Javadoc:

Группа ноль обозначает весь шаблон, поэтому выражение m.group (0) эквивалентно m.group ().

3 голосов
/ 19 октября 2010

Есть две группы, но ошибка в том, что ничего не делается с сопоставителем.
Возникает исключение 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?
}
2 голосов
/ 19 октября 2010

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

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

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

Сопоставитель создается из шаблона вызывая метод сопоставления шаблона. После того, как создан, сопоставитель может быть использован для выполнить три разных вида матча операции:

Метод соответствует метод пытается найти соответствие вся входная последовательность против шаблон.

Метод lookingAt пытается найти соответствие последовательность ввода, начиная с начало, против образца.

Метод find сканирует ввод последовательность ищет следующий подпоследовательность, которая соответствует шаблону.

Источник: 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 голос
/ 19 октября 2010

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

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!");
}

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

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