Я пытаюсь понять разницу между matches()
и find()
.
Согласно Javadoc, (из того, что я понимаю), matches()
будет искать всю строку, даже если он найдет то, что ищет, и find()
остановится, когда найдет то, что ищет.
Если это предположение верно, я не могу видеть, когда вы захотите использовать matches()
вместо find()
, если вы не хотите посчитать количество найденных совпадений.
По моему мнению, класс String должен иметь find()
вместо matches()
встроенного метода.
Итак, подведем итог:
- Правильно ли мое предположение?
- Когда это полезно использовать
matches()
вместоfind()
?
find()
несколько раз может вернуть разные результаты для одного и того жеMatcher
. Смотрите мой ответ ниже.Ответы:
matches
пытается сопоставить выражение со всей строкой и неявно добавить a^
в начале и$
в конце вашего шаблона, то есть он не будет искать подстроку. Отсюда вывод этого кода:123
является подстрокой,a123b
поэтомуfind()
метод выводит true.matches()
только «видит»,a123b
который не совпадает123
и, следовательно, выводит ложь.источник
matchers()
это не простоfind()
подразумеваемое окружение ^ и $. Помните, что вызов.find()
более одного раза может иметь разные результаты, если ему не предшествуетreset()
, аmatches()
всегда будет возвращать один и тот же результат. Смотрите мой ответ ниже.matches
вернуть true, если вся строка соответствует заданному шаблону.find
пытается найти подстроку, которая соответствует шаблону.источник
matches(p)
это так же, какfind("^" + p + "$")
если бы это было немного яснее."123abc123".matches("[a-z]+")
потерпит неудачу, как и раньше"123abc123".find("^[a-z]+$")
. Моя точка зрения состояла в том, что этоmatches()
подходит для полного матча, так же какfind()
с начальным и конечным якорями.Pattern.compile("some pattern").matcher(str).matches()
Pattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
это не в точности равно...("^some pattern$").matcher(str).find()
это только истинным в первом вызове. Смотрите мой ответ ниже.matches()
вернет true, только если найдена полная строка.find()
попытается найти следующее вхождение в подстроке, которая соответствует регулярному выражению. Обратите внимание на акцент на «следующий». Это означает, что результат вызоваfind()
несколько раз может не совпадать. Кроме того, с помощьюfind()
вы можете вызвать,start()
чтобы вернуть позицию, в которой подстрока была найдена.Будет выводить:
Поэтому будьте осторожны при
find()
многократном вызове, еслиMatcher
объект не был сброшен, даже когда регулярное выражение окружено^
и$
соответствует полной строке.источник
find()
будет рассматривать подстроку против регулярного выражения, где asmatches()
будет считать полное выражение.find()
возвращает true, только если подстрока выражения соответствует шаблону.источник
matches();
не буферизует, ноfind()
буферизирует.find()
сначала выполняет поиск в конце строки, индексирует результат и возвращает логическое значение и соответствующий индекс.Вот почему, когда у вас есть такой код
На этапе 4: механизм регулярных выражений, использующий структуру шаблона, прочитает весь ваш код (от индекса к индексу, как указано в параметре,
regex[single character]
чтобы найти хотя бы одно совпадение. Если такое совпадение найдено, оно будет проиндексировано, тогда цикл будет выполняться на основе индексированный результат else, если он не выполнял предварительное вычисление, например, которыйmatches()
не делает. Оператор while никогда не будет выполнен, поскольку первый символ совпадающей строки не является алфавитом.источник