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