Совпадения методов не работают хорошо
Я не понимаю, почему с этим регулярным выражением метод возвращает 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).
Рекомендации
- регулярные выражения.info/Repetition со звездами и плюсами и точечными совпадениями (почти) с любым персонажем
Смежные вопросы
Обратите внимание, что оба .
а также *
(а также другие метасимволы) могут потерять свое особое значение в зависимости от того, где они появляются. [.*]
класс символов, соответствующий буквальному периоду .
или буквальная звездочка *
, Предваряющий обратный слеш также экранирует метасимволы, поэтому 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"]