System.out.println(Pattern.matches("[amn]?", "a"));
Это утверждение возвращает true.
Но
System.out.println(Pattern.matches("[amn]?", "amn"));
System.out.println(Pattern.matches("[amn]?", "adef"));
Эти утверждения возвращают false.
Зачем?
Мое понимание о квантере regex "?" это.
Regex: X?
Описание: X происходит раз или нет вообще
Итак, утверждение "[amn]?" "amn" должен возвращать true, потому что a, m, n происходит один раз. И аналогично в "[amn]?" "adef" a встречается только один раз, а m и n вообще не встречаются.
Где я иду не так?
Регулярное выражение [amn]?
соответствует любой строке, которая состоит из a
, m
или n
и ничего другого. Такой, как "a"
, который выполняет это условие.
amn
и adef
, однако, начать с одного из этих писем, но по- прежнему так, что "один раз или вообще не" правило не выполняется.
?
частично означает, что может быть ноль или более совпадений a, m, n, так что это означает, что независимо от того, какой тип ввода вы даете этому регулярному выражению, оно может идти бесконечно, даже не проверяя ничего так? здесь нет смысла использовать.
Первое возвращает true, потому что a
- одна буква, которая является либо a, m, либо n.
Остальные возвращают false, потому что нет ни одной буквы, там 3 и 4 буквы.
Несмотря на то, что ваша группа писем содержит 3 буквы, она будет проверять только наличие одного из них.
[amn]
- это группа, состоящая из символов "a", "m" и "n". [amn]?
означает "один из символов из группы [amn] или вообще никакого персонажа".
Pattern.matches
пытается сопоставить весь шаблон со всей входной строкой.
Если вам нужна последовательность символов "amn", вы можете попробовать (amn)?
, что должно означать "последовательность" amn "или ничего".
Сопряжения функции matches()
соответствуют всей строке относительно регулярного выражения, что означает, что она вернет true
только если полная строка может быть сопоставлена выражением, а не какой-либо подпоследовательностью. См. Эту документацию.
[amn]?
означает, что либо a, либо m или n может существовать один или несколько раз. Только случаи, для которых matches()
вернет true
:
Все остальные случаи будут указаны как ложные.
Если вы хотите найти регулярное выражение в некоторой строке, используйте функцию find()
как показано ниже.
Pattern p = Pattern.compile("[amn]?");
Matcher mat = p.matcher(""); //pass amn or adef
boolean matches = false;
while(mat.find()){
matches = true;
break;
}
System.out.println(matches);
matches()
и find()
- две совершенно разные функции.
? означает совпадение с текущим регулярным выражением, а не жадным