Совпадения методов не работают хорошо

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

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

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

3 ответа

Решение

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

Это верно для String.matches, Pattern.matches а также Matcher.matches,

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

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

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

Какие .* средства

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

Рекомендации

Смежные вопросы

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


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

Java не имеет регулярных выражений endsWith, startsWith, а также contains, Вы все еще можете использовать matches выполнить то же самое следующим образом:

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

String API быстрый шпаргалка

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

  • Методы без регулярных выражений:
    • String replace(char oldChar, char newChar)
    • String replace(CharSequence target, CharSequence replacement)
    • boolean startsWith(String prefix)
    • boolean endsWith(String suffix)
    • boolean contains(CharSequence s)
  • Методы регулярных выражений:
    • String replaceAll(String regex, String replacement)
    • String replaceFirst(String regex, String replacement)
    • String[] split(String regex)
    • boolean matches(String regex)

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

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

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

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

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

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

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

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

Метод match возвращает массив с сопоставленными группами. Таким образом, он не только сообщает вам, есть ли у вас совпадение, но также возвращает группы совпадений в случае, если у вас есть совпадение.

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"]
Другие вопросы по тегам