2015-03-09 6 views
-1

При попытке сопоставления "??M?E???" с рисунком "^([\\?]+)M([\\?]+)E([\\?]+)$", я получаю «Нет совпадения», хотя он работает для "?M?E??" в порядке.Java Regex Question Mark

Мой фрагмент кода

  Pattern p = Pattern.compile("^([?]+)[M]{1}([?]+)[E]{1}([?]+)$"); 
     Matcher m = p.matcher(input); 
     if (!m.find()) { 
      System.out.println("No Match"); 
      continue ; 
     } 
     x = m.group(1).length(); 
     y = m.group(2).length(); 
     z = m.group(3).length(); 
+0

Я попробовал код размещен после редактирования и она отлично работает. Производит '2, 1, 3' для' ?? M? E ??? 'и' 1, 1, 2' за '? M? E ??'. Вы должны делать что-то еще не так, в коде, который вы не публиковали, или ваш вход на самом деле отличается от того, что вы говорите. – Jesper

ответ

1

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

^([?]+)M([?]+)E([?]+)$ 

Или избежать его, но получить его из класса *:

^(\?+)M(\?+)E(\?+)$ 

* Примечание что в Java \ представлен как \\

После того, как вы отредактировали свой вопрос и разместили фактический код, похоже, что у вас есть объявление ifferent regex (пожалуйста, не делайте этого в следующий раз), вы должны использовать matches вместо find. Ваша проблема должна быть из-за содержания input, он просто не делает find return true, обратите внимание, что find пытается найти следующее вхождение в подстроке, которое соответствует регулярному выражению.

1

Как выглядит ваш код? Это прекрасно работает:

Pattern pattern = Pattern.compile("^([\\?]+)M([\\?]+)E([\\?]+)$"); 

System.out.println(pattern.matcher("??M?E???").matches()); 
System.out.println(pattern.matcher("?M?E??").matches()); 

Выход:

true 
true