Я не понимаю, почему с этим регулярным выражением метод возвращает 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"]