Поэтому я столкнулся с ошибкой, вызванной ожиданием того, что метод 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 'активный': ''
Найдено совпадение хотя бы в части строки? правда
Каков был матч? 'НАЧАЛО'
Это имеет смысл.
Метод matches(...)
должен пытаться использовать всю строку, так что это происходит даже с не-жадным шаблоном.
Метод find(...)
может найти подстроку, поэтому он останавливается в точке, если находит какую-либо подходящую подстроку.
matches()
хотя.
Они должны быть разными. Matcher#matches
попытками совместить полную строку ввода с использованием неявных якорей ^
и $
вокруг вашего регулярного выражения, тогда как Matcher#find
совпадения, которые может соответствовать вашему регулярному выражению.
Согласно Джавадоку:
public boolean matches()
Попытка сопоставить весь регион с шаблоном. Если совпадение завершается успешно, более подробная информация может быть получена с помощью методов начала, конца и группы.
а также
public boolean find()
Попытка найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.
matches
m.matches()
только в том случае, если они совпадают со всей строкой, я полагаю, что из этого следует, что если вы используетеm.matches()
и это успешно,m.group()
без аргументов всегда возвращает всю входную строку.