Я не понимаю, почему с этим регулярным выражением метод возвращает false,
Pattern.matches("\\bi", "an is");
символ я находится на границе слова!
Я не понимаю, почему с этим регулярным выражением метод возвращает false,
Pattern.matches("\\bi", "an is");
символ я находится на границе слова!
В Java matches пытается сопоставить шаблон со всей строкой.
Это справедливо для String.matches, Pattern.matches и Matcher.matches.
Если вы хотите проверить, есть ли где-нибудь в строке, вы можете использовать .*\bi.*. В этом случае, как строковый литерал Java, он ".*\\bi.*".
java.util.regex.Matcher Ссылки APIboolean 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Вот быстрый лист читов, в котором перечислены, какие методы основаны на регулярных выражениях, а какие нет:
Вся строка должна совпадать, если вы используете совпадения:
Pattern.matches(".*\\bi.*", "an is")
Это позволяет использовать 0 или более символов до и после. Или:
boolean anywhere = Pattern.compile("\\bi").matcher("an is").find();
сообщит вам, соответствует ли какая-либо подстрока (true в этом случае). В качестве примечания, компиляция регулярных выражений, а затем их поддержание может повысить производительность.
Я не понимаю, почему 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"]