1

Javaの正規表現でわからないことがあります。次の文字列があります(「to Date」が必要です):

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 では、このパターンは一致しません。しかし、前と最後に a を追加すると、.+ このパターンは Java で機能します。

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

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

4

2 に答える 2

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);

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

于 2012-04-04T07:14:43.550 に答える
0

別の質問からのこの回答もあなたの質問に答えると思います。JavaとPerlの正規表現の動作が異なるのはなぜですか。

于 2012-04-04T07:19:17.183 に答える