2012-04-04 9 views
1

Javaの正規表現でわからないことがあります。私は、次の文字列を持っている(と私は「日に」必要があります):境界マッチャー "Beginning of line"なしで正規表現が一致しないのはなぜですか?

From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;; 

は私が(Perlで)次の正規表現がマッチしているだろうと思います。

to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}) 

Javaでは、このパターンは一致しません。私は前に、最後に.+ を追加した場合しかし、それはそう、このパターンは、Javaで動作しない:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE); 

私は理解していない何を:最初のパターンがで一致していないだろうと私には明らかですJavaの場合は、^(行の先頭)と$を行末に追加します。つまり、パターンは行全体に一致しなければならないということです。しかし、それがなければ最初のパターンは実際に一致しているはずです。なぜなら、デリミタを前面と最後に設定しないと、パターンがこのパターンの範囲外の文字列データを気にするのですから?これは私には論理的ではありません。私の意見では、最初のパターンはStringクラスの "contains"メソッドと同様に動作するはずです。そして私はそれがPerlでそうだと思います。

+0

[regexplanet](http://www.regexplanet.com/advanced/java/index.html)でJava regexpをテストできます。私はあなたのパターンがそこに。+の中で働くことさえできなかった。 –

答えて

6

Javaでは、matches()が文字列全体を検証します。あなたの入力には改行が含まれている可能性があります(これは.+と一致しません)。

代わりに、このお試しください:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("... \n From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;; \n ..."); 

System.out.println(m.matches()); // prints false 

if(m.find()) { 
    System.out.println(m.group(1)); // prints 30/11/2011 
} 

をそしてfind()を使用しているとき、あなたはパターンから.+年代をドロップすることができます。

Pattern.compile("to\\s+date\\s*?:\\s*?([0-9]{2}[./][0-9]{2}[./][0-9]{2,4})", Pattern.CASE_INSENSITIVE); 

文字クラス内.をエスケープする(必要はありません、btw)

+0

「find」はトリックです。 Btw:そうです、私は文字クラス内のエスケープ文字を省略することができます、それを知らなかった。 – Bevor

関連する問題