Почему регулярное выражение Java «соответствует» и «находит» получает другое совпадение при использовании не жадного шаблона?

1

Поэтому я столкнулся с ошибкой, вызванной ожиданием того, что метод matches() найдет точно такое же совпадение, как и с помощью find(). Обычно это так, но кажется, что если нежелательный шаблон можно растянуть, чтобы с жадностью принять всю строку, ее разрешено. Это похоже на ошибку в Java. Я ошибаюсь? Я ничего не вижу в документах, которые указывают на это поведение.

Pattern stringPattern = Pattern.compile("'.*?'");
String nonSingleString = "'START'===stageType?'active':''";
Matcher m1 = stringPattern.matcher(nonSingleString);
boolean matchesCompleteString = m1.matches();
System.out.println("Matches complete string? " + matchesCompleteString);
System.out.println("What was the match? " + m1.group()); //group() gets the string that matched

Matcher m2 = stringPattern.matcher(nonSingleString);
boolean foundMatch = m2.find(); //this looks for the next match
System.out.println("Found a match in at least part of the string? " + foundMatch);
System.out.println("What was the match? " + m2.group());

Выходы

Соответствует полной строке? правда
Каков был матч? 'START' === stageType 'активный': ''
Найдено совпадение хотя бы в части строки? правда
Каков был матч? 'НАЧАЛО'

  • 0
    Поскольку matches m.matches() только в том случае, если они совпадают со всей строкой, я полагаю, что из этого следует, что если вы используете m.matches() и это успешно, m.group() без аргументов всегда возвращает всю входную строку.
Теги:

2 ответа

8

Это имеет смысл.

Метод matches(...) должен пытаться использовать всю строку, так что это происходит даже с не-жадным шаблоном.

Метод find(...) может найти подстроку, поэтому он останавливается в точке, если находит какую-либо подходящую подстроку.

  • 0
    +1. Иными словами, неохотные квантификаторы соответствуют как можно меньшему количеству элементов, и наименьшее количество элементов, которым он может соответствовать, чтобы охватить всю строку, - все они.
  • 0
    +1. Метод называется matches() хотя.
Показать ещё 3 комментария
6

Они должны быть разными. Matcher#matches попытками совместить полную строку ввода с использованием неявных якорей ^ и $ вокруг вашего регулярного выражения, тогда как Matcher#find совпадения, которые может соответствовать вашему регулярному выражению.

Согласно Джавадоку:

public boolean matches()

Попытка сопоставить весь регион с шаблоном. Если совпадение завершается успешно, более подробная информация может быть получена с помощью методов начала, конца и группы.

а также

public boolean find()

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

Ещё вопросы

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