2012-03-06 8 views
4

は、私は、次のコードを持っている:Android REGEXをPatternクラスとMatcherクラスで使用するにはどうすればよいですか?

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

答えて

6

デフォルトでは、。改行と一致しません。正規表現オプションを追加する必要があります:

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

これは完璧に機能しました!ありがとう! – Davidoff

3

m.matches()は、文字列全体が一致する場合にのみtrueを返します。代わりにm.find()を使用すると、よりうまくいくはずです!

+0

文字列全体が正規表現と一致するべきではありませんか?私はそれがすべきだと思う! とにかく、while(m.find)を使ってみましたが、ループしていないので、別の問題だと思います! – Davidoff

+1

多分私は少し不明だった。 matches()はパターンの先頭と最後に暗黙的に "^"と "$"を追加するので、 "<! - "で始まり " - >"で終わるので文字列は一致しません。多分find()とarcのソリューションの組み合わせがうまくいくでしょうか?編集:申し訳ありませんが、あなたのパターンを間違って読んでいます。 Canerの言うように、それは少し間違って見える。 – Petter

1

最初に、アークが言った通りです。 Pattern.DOTALLを有効にし、Petter Mとしてm.find()を使用する必要があります。それ以外の場合は一致しません。

次に、何らかの理由で、Pattern.DOTALLで作業できない場合は、この他の式を使用できます。

FILES_SECTION(:?|。\ S)* FILES_SECTION

(私はFILES_SECTION区切り文字の間に文字の非キャプチャグループを使用しています)。

+0

詳細をありがとう:-) – Davidoff

+0

また、matches()で式を使用してPattern.DOTALLを有効にし、すべての?文字を表現から削除します。覚えていますか? 0と1の間で一致し、a *は0とnの間で一致します。一種の疑問です。こうすることで、独自の式を "。* FILES_SECTION。* FILES_SECTION。*"に単純化することができます。ただし、Pattern.DOTALLを使用する必要があります。とにかく、私はこの表現が広すぎると思う。 :) – greguren

+0

あなたがDOTALLを避ける別の方法は、この文字クラスを使用するでしょう:[\ d \ D] + これは数字か数字ではないものと一致します。 – arc

関連する問題