2012-03-06 199 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

你的模式是不是接近你想要的。我建议你应该更多关于正则表达式之前:http://docs.oracle.com/javase/tutorial/essential/regex/ – Caner 2012-03-06 14:49:48

回答

6

默认情况下,不符合换行符。您需要添加正则表达式选项,以便它可以:

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

完美运作!谢谢! – Davidoff 2012-03-06 15:00:47

3

只有整个字符串匹配时,m.matches()才会返回true。使用m.find()代替,它应该更好用!

+0

但不应该整个字符串匹配正则表达式?我认为它应该! 无论如何,我已经尝试使用一段时间(m.find),它甚至不会循环一次,所以我认为这是一个不同的问题! – Davidoff 2012-03-06 14:48:46

+1

也许我有点不清楚。 matches()在模式的开始和结尾隐式添加“^”和“$”,所以你的字符串不会匹配,因为它以“<! - ”开始并以“ - >”结尾。也许find()和arc的解决方案的组合可以工作?编辑:对不起,我看错了你的模式。就像Caner说的那样,它看起来有点不对。 – Petter 2012-03-06 14:53:32

1

首先,正如弧所说,。将不匹配\ n,除非你激活Pattern.DOTALL,并且作为Petter M,你应该使用m.find(),否则它将不匹配。

然后,你可以使用这个其他的表达,如果以任何理由,你不能与Pattern.DOTALL工作。

FILES_SECTION(:|?\ S)* FILES_SECTION

(请注意我用的FILES_SECTION分隔符之间的字符非捕获组)。

+0

谢谢你的详细信息:-) – Davidoff 2012-03-06 15:01:05

+0

此外,你可以使用你的表达与matches()启用Pattern.DOTALL并删除所有?表达式中的字符。记得吗?匹配0到1次之间的数字,并且*匹配0到n次之间的数字...因此写入类似于*的内容?是没有意义的。这样,您可以将自己的表达式简化为:“。* FILES_SECTION。* FILES_SECTION。*”,前提是您使用Pattern.DOTALL。无论如何,我认为这种表达可能过于宽泛。 :) – greguren 2012-03-06 15:06:02

+0

你能避免DOTALL另一种方法是使用这个字符类:\ d \ d] + 这将匹配任何要么是一个数字或不是数字..即任何事情 – arc 2012-03-06 15:12:21