2016-09-29 3 views
1
System.out.println(Pattern.matches("[amn]?", "a")); 

Это утверждение возвращает true.Как квантор java "?" Работа?

Но

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

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

Эти заявления возвращает ложь.

Почему?

Мое понимание о квантере regex "?" это.

Regex: X?
Описание: X встречается один раз или вообще не

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

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

+0

Матчи работают иначе, чем находят. Найти будет работать. – Antoniossss

ответ

2

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

и adef, однако, начинайте с одной из этих букв, но продолжайте так, чтобы правило «один раз или совсем не выполнялось».

+0

Привет .. Я добавил фрагмент кода, и он работает. В чем разница? –

+0

@AmberBeriwal glglgl прав, но '?' Часть означает, что может быть нулевое или большее совпадение a, m, n, поэтому оно означает независимо от того, какой вход, который вы даете этому регулярному выражению, может идти бесконечно, даже не проверяя что-нибудь так? здесь нет смысла использовать. –

+1

? означает ** не более 1 **. Поведение, описываемое вами, выражается символом '*' (star). Таким образом, 2 вхождения не заполняют правило «не более 1» – Antoniossss

1

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

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

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

0

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

1

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

[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()' - две очень разные функции. – rorschach

1

[amn] представляет собой группу, состоящую из символов "A", "т" и "п". [amn]? означает «один из символов группы [amn] или вообще никакого символа».

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

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

Смежные вопросы