Метод не работает хорошо

Я не понимаю, почему с этим регулярным выражением метод возвращает false,

Pattern.matches("\\bi", "an is");

символ я находится на границе слова!

Ответ 1

В Java matches пытается сопоставить шаблон со всей строкой.

Это справедливо для String.matches, Pattern.matches и Matcher.matches.

Если вы хотите проверить, есть ли где-нибудь в строке, вы можете использовать .*\bi.*. В этом случае, как строковый литерал Java, он ".*\\bi.*".

java.util.regex.Matcher Ссылки API

  • boolean matches(): Попытка сопоставить всю область с шаблоном.

Что .* означает

Как используется здесь, точка . является метасимволом регулярного выражения, что означает (почти) любой символ. * является метасимволом регулярного выражения, что означает "нулевое или большее повторение". Итак, например, что-то вроде A.*B соответствует A, за которым следует нуль или больше символа "any", за которым следует B (см. на rubular.com).

Ссылки

Связанные вопросы

Обратите внимание, что и теги ., и * (а также другие метасимволы) могут потерять свое особое значение в зависимости от того, где они появляются. [.*] - это класс символов, который соответствует либо буквальному периоду ., либо буквенной звездочке *. Предшествующая обратная косая черта также ускользает от метасимволов, поэтому a\.b соответствует "a.b".


Связанные проблемы

Java не имеет regex-based endsWith, startsWith и contains. Вы можете использовать matches для выполнения следующих действий:

  • matches(".*pattern.*") - содержит ли он соответствие шаблону где-нибудь?
  • matches("pattern.*") - начинается ли это с соответствия шаблону?
  • matches(".*pattern") - заканчивается ли совпадение с шаблоном?

String Быстрый лист обмана API

Вот быстрый лист читов, в котором перечислены, какие методы основаны на регулярных выражениях, а какие нет:

Ответ 2

Вся строка должна совпадать, если вы используете совпадения:

Pattern.matches(".*\\bi.*", "an is")

Это позволяет использовать 0 или более символов до и после. Или:

boolean anywhere = Pattern.compile("\\bi").matcher("an is").find();

сообщит вам, соответствует ли какая-либо подстрока (true в этом случае). В качестве примечания, компиляция регулярных выражений, а затем их поддержание может повысить производительность.

Ответ 3

Я не понимаю, почему Java решила пойти в противоположном направлении от таких языков, как Perl, которые поддерживали регулярное выражение в течение многих лет. Я выбросил стандартное Java-выражение и начал использовать свой собственный regex lib для perl-стиля для Java под названием MentaRegex. Ниже показано, как regex может иметь смысл в Java.

Соответствие методу возвращает логическое выражение, есть ли регулярное выражение или нет.

matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true

Соответствие метода возвращает массив с сопоставленными группами. Поэтому он не только сообщает вам, есть ли у вас совпадение или нет, но также возвращает группы, сопоставленные в случае, если у вас есть соответствие.

match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]

Метод sub позволяет выполнять подстановки с регулярным выражением.

sub("aa11bb22", "s/\\d+/00/g" ) => "aa00bb00"

Поддержка глобального и регистро-независимого регулярного выражения.

match("aa11bb22", "/(\\d+)/" ) => ["11"]
match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
matches("Sergio Oliveira Jr.", "/oliveira/" ) => false
matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true

Позволяет вам изменить escape-символ, если вам не нравится видеть так много "\".

match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"]
match("aa11bb22", "/(#d+)/g", '#' ) => ["11", "22"]