Подскажите. Есть код с сайта. Почему m.group(1) выдает Найдено значение: Крещение Руси произошло в 98 Почему m.group(2) выдает Найдено значение: 8
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class k4 {
public static void main( String args[] ) {
// Строка для сканирования, чтобы найти шаблон
String str = "Крещение Руси произошло в 988 году! Не так ли?";
String pattern = "(.*)(\\d+)(.*)";
// Создание Pattern объекта
Pattern r = Pattern.compile(pattern);
// Создание matcher объекта
Matcher m = r.matcher(str);
if (m.find( )) {
System.out.println("Найдено значение: " + m.group(0));
System.out.println("Найдено значение: " + m.group(1));
System.out.println("Найдено значение: " + m.group(2));
}else {
System.out.println("НЕ СОВПАДАЕТ");
}
} }
Давайте разберём данное регулярное выражение :
В интерпретаторе regex джавы пишут \\ вместо \ (как в большинстве языков), я разбиру как в большинстве.
(.*)(\d+)(.*)
. - любой символ | .* - строка из любых символов кроме \n, количество от 0 до бесконечности (жадный отбор строки).
(.*) - скобочки делают из внутреннего выражения группу, т.е. тот участок строки соответствующий подскобочному выражению в match выделится в отдельную группу.
\d - цифра, \d+ - строка из любых цифр, количество от 1 до бесконечности
(\d+) - группа состоящая только из цифр.
А теперь разберём, что мы имеем для (.*)(\d+)(.*):
Крещение Руси произошло в 988 году! Не так ли?
Сначало выражение жадно читает абсолютно все символы, коих может быть от 0 до беск. После этой части у нас должны быть цифры, коих есть от 1 до беск. и опять символы тупо до конца строки, которые сформируют 3 группу. Учитывая, что первая группа жадная, то она решает, что после неё как минимум должна идти одна цифра, она как истинная жадина забирает всё, что плохо лежит, т.е. 98 и оставляет 1 восьмёрку для 2 группы.
Противоположность жадности - лень (лень забирать, что-нибудь). 1 группа знает, что 2 группа начинается с цифр и встретив их она ленится идти дальше и передаёт бразды правления 2 группе.
Т.е. правильная запись регулярки (.*?)(\d+)(.*).
? - указатель, что набирание элементов ленивое.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости