Сбой соответствия групп Regex в Java

1

Почему этот шаблон регулярного выражения не соответствует группам на Java. Когда я запускаю тот же пример в оболочке bash с echo и sed это работает.

String s = "Match foo and bar and baz";
//Pattern p = Pattern.compile("Match (.*) or (.*) or (.*)"); //was a typo
Pattern p = Pattern.compile("Match (.*) and (.*) and (.*)");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

Я ожидаю соответствия foo, bar и baz.

$ echo "Match foo and bar and baz" | sed 's/Match \(.*\) and \(.*\) and \(.*\)/\1, \2, \3/'
foo, bar, baz
Теги:
sed

4 ответа

1
Лучший ответ

Это из-за жадного характера .*. Вы можете использовать это регулярное выражение:

Pattern p = Pattern.compile("Match (\\S+) and (\\S+) and (\\S+)");

Здесь это регулярное выражение использует \\S+ что означает совпадение 1 или более не-пробелов.

Полный код

Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1) + ", " + m.group(2) + ", " + m.group(3));
}
  • 0
    То же, что и исходный код моего кода, который выводит: foo в моей системе, и затем программа завершается. Если вы уверены, что ваш пример работает, то я бы сказал, что у моей среды выполнения Java есть проблема. Так вы уверены, что пример верный?
  • 0
    это потому, что ваш цикл неправильный. Смотрите обновленный код сейчас
Показать ещё 5 комментариев
1

Вы пытаетесь сопоставить всю String, поэтому

while (m.find()) {

будет повторяться только один раз.

Эта единственная find() будет захватывать все группы. Таким образом, вы можете распечатать их как

System.out.println(m.group(1) + " " + m.group(2) + m.group(3));

Или используйте цикл for над Matcher#groupCount().

1

Ваше регулярное выражение правильно, но вам нужно распечатать разные группы, а не только 1-го, ex:

while (m.find()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
}
0

Это похоже на простую опечатку (orand):

Pattern p = Pattern.compile("Match (.*) and (.*) and (.*)");

ОБНОВИТЬ

Заменить:

String s = "Match foo and bar and baz";
String replaced = s.replaceAll("Match (.*) and (.*) and (.*)", "$1, $2, $3");
System.out.println(replaced);
  • 0
    ах это была опечатка, но твой пример тоже не работает
  • 0
    @lanoxx, работает. Смотрите это: ideone.com/x19deY
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню