2012-03-06 1 views
4

У меня есть следующий код: «? КАРТИНЫ НЕ СООТВЕТСТВУЕТ»Как использовать Android REGEX с помощью классов шаблонов и классов?

String example = "<!--§FILES_SECTION§\n" + 
       "Example line one\n" + 
       "Example line two\n" + 
       "§FILES_SECTION§-->"; 

     String myPattern = ".*?FILES_SECTION.*?\n(.*?)\n.*?FILES_SECTION.*?"; 
     Pattern p = Pattern.compile(myPattern); 
     Matcher m = p.matcher(example); 

     if (m.matches()) 
      Log.d("Matcher", "PATTERN MATCHES!"); 
     else 
      Log.d("MATCHER", "PATTERN DOES NOT MATCH!"); 

Почему это всегда вернуться

+0

Ваш шаблон даже не близок к тому, что вы хотите. Я рекомендую вам больше об regex раньше: http://docs.oracle.com/javase/tutorial/essential/regex/ – Caner

ответ

6

По умолчанию. не соответствует разрыву строк. Вам нужно будет добавить опцию регулярного выражения так, чтобы она:

Pattern p = Pattern.compile(myPattern,Pattern.DOTALL); 
+0

Это сработало отлично! Благодаря! – Davidoff

3

m.matches() вернет true только в том случае, если вся строка соответствует. Вместо этого используйте m.find(), и он должен работать лучше!

+0

Но не должна ли вся строка соответствовать регулярному выражению? Я думаю, это должно быть! В любом случае, я пробовал использовать некоторое время (m.find), и он даже не зацикливается, так что я думаю, что это другая проблема! – Davidoff

+1

Возможно, я был немного неясен. matches() неявно добавляет «^» и «$» в начале и конце вашего шаблона, поэтому ваша строка не будет совпадать, так как она начинается с «». Может быть, комбинация find() и решения arc будет работать? Изменить: извините, я неправильно прочитал ваш шаблон. Как говорит Канер, это выглядит немного неправильно. – Petter

1

Во-первых, как говорила дуга. не будет соответствовать \ n, если вы не активируете Pattern.DOTALL, а как Petter M, вы должны использовать m.find(), иначе он не будет соответствовать.

Тогда вы могли бы использовать это другое выражение, если по какой-либо причине вы не можете работать с Pattern.DOTALL.

FILES_SECTION (: |?. \ S) * FILES_SECTION

(Примечание я использую, не захватив группу для символов между FILES_SECTION разделителей).

+0

Благодарим вас за подробности :-) – Davidoff

+0

Кроме того, вы можете использовать свое выражение со спичками(), позволяющее Pattern.DOTALL И удалить все? символов из выражения. Помните? совпадает с 0 и 1 раз, а a * совпадает с числом от 0 до n раз ... поэтому записывая что-то вроде *? это спорный вопрос. Таким образом, ваше собственное выражение может быть упрощено: «. * FILES_SECTION. * FILES_SECTION. *», Если вы используете Pattern.DOTALL. Во всяком случае, я думаю, что это выражение может быть слишком широким. :) – greguren

+0

Другой способ, которым вы могли бы избежать DOTALL, будет использовать этот класс символов: [\ d \ D] + Это будет соответствовать любому значению или цифре или нет. – arc

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

  • Нет связанных вопросов^_^