GaneshRfromSpace Ответов: 2

Как работает Квантор регулярных выражений java“?"?


System.out.println(Pattern.matches("[amn]?", "a"));


Это утверждение возвращает true.

Но

System.out.println(Pattern.matches("[amn]?", "amn"));


System.out.println(Pattern.matches("[amn]?", "adef"));


Эти утверждения возвращают false.

Почему?

Что я уже пробовал:

Мое понимание квантора регулярных выражений"? " таково.

Регулярное выражение: Икс?
Описание: Х встречается один раз или не на всех

Итак, утверждение "[amn]?" "amn" должно возвращать true, потому что a,m,n происходит один раз. И точно так же в "[amn]?" "adef" a встречается только один раз, а m и n не встречаются вообще.

Где я ошибаюсь ?

2 Ответов

Рейтинг:
18

OriginalGriff

Проблема в том, что "?" означает именно это: "0 или 1 повторение предыдущего пункта"
Значит, это необязательно.
Возьмем регулярное выражение "целое число" :

^[+-]?\d+$

Это говорит о том, что " вся строка состоит по крайней мере из одной цифры, которой может предшествовать один плюс или минус"
Так что все совпадает:
0
1
123456789
-1
+0
Но это не сработало.
A
++0
+-999
Ваше регулярное выражение соответствует " нулю или одному символу из 'a', 'm' или ' n '" - что означает, что оно соответствует чему-либо вообще!
если бы это было написано как
^[amn]?$
Тогда он будет соответствовать
a
n
m
Но не совпадет
b
c
9
Hello!

Получить копию Экспрессо[^]- это бесплатно, и он исследует и генерирует регулярные выражения.


CPallini

5.

Рейтинг:
0

Peter_in_2780

В Pattern.matches("[amn]?", ...) фрагмент [amn] означает " любой один символ из множества {a, m, n}". Так [amn]? должен соответствовать точно нулю или одному из этих символов. В вашем втором примере есть три совпадения, отсюда и ложное возвращение. Имейте в виду, что matches функция "пытается сопоставить все входные данные с шаблоном" (перефразируя документацию). Pattern.matches() это действительно странный зверь.
Однако третий результат меня удивляет. У меня нет возможности проверить это прямо сейчас.