Почему этот шаблон регулярного выражения не соответствует группам на 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
Это из-за жадного характера .*
. Вы можете использовать это регулярное выражение:
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));
}
Вы пытаетесь сопоставить всю String
, поэтому
while (m.find()) {
будет повторяться только один раз.
Эта единственная find()
будет захватывать все группы. Таким образом, вы можете распечатать их как
System.out.println(m.group(1) + " " + m.group(2) + m.group(3));
Или используйте цикл for
над Matcher#groupCount()
.
Ваше регулярное выражение правильно, но вам нужно распечатать разные группы, а не только 1-го, ex:
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
Это похоже на простую опечатку (or
→ and
):
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);
foo
в моей системе, и затем программа завершается. Если вы уверены, что ваш пример работает, то я бы сказал, что у моей среды выполнения Java есть проблема. Так вы уверены, что пример верный?