Как работает Java-квантификатор «?»?

2
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 вообще не встречаются.

Где я иду не так?

  • 0
    Спички работает по-другому, затем найти. Найти будет работать.
Теги:

5 ответов

2
Лучший ответ

Регулярное выражение [amn]? соответствует любой строке, которая состоит из a, m или n и ничего другого. Такой, как "a", который выполняет это условие.

amn и adef, однако, начать с одного из этих писем, но по- прежнему так, что "один раз или вообще не" правило не выполняется.

  • 0
    Привет .. Я добавил фрагмент кода, и это работает. В чем может быть разница?
  • 0
    @AmberBeriwal glglgl правильно, но ? частично означает, что может быть ноль или более совпадений a, m, n, так что это означает, что независимо от того, какой тип ввода вы даете этому регулярному выражению, оно может идти бесконечно, даже не проверяя ничего так? здесь нет смысла использовать.
Показать ещё 1 комментарий
1

Первое возвращает true, потому что a - одна буква, которая является либо a, m, либо n.

Остальные возвращают false, потому что нет ни одной буквы, там 3 и 4 буквы.

Несмотря на то, что ваша группа писем содержит 3 буквы, она будет проверять только наличие одного из них.

1

[amn] - это группа, состоящая из символов "a", "m" и "n". [amn]? означает "один из символов из группы [amn] или вообще никакого персонажа".

Pattern.matches пытается сопоставить весь шаблон со всей входной строкой.

Если вам нужна последовательность символов "amn", вы можете попробовать (amn)? , что должно означать "последовательность" amn "или ничего".

1

Сопряжения функции matches() соответствуют всей строке относительно регулярного выражения, что означает, что она вернет true только если полная строка может быть сопоставлена выражением, а не какой-либо подпоследовательностью. См. Эту документацию.

[amn]? означает, что либо a, либо m или n может существовать один или несколько раз. Только случаи, для которых matches() вернет true:

  1. "А"
  2. "М"
  3. "П"
  4. ""

Все остальные случаи будут указаны как ложные.

Если вы хотите найти регулярное выражение в некоторой строке, используйте функцию 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);
  • 1
    matches() и find() - две совершенно разные функции.
0

? означает совпадение с текущим регулярным выражением, а не жадным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню