2009-04-24 7 views
14

私の理解は、Javaの正規表現の実装はPerlに基づいているということです。しかし、次の例では、同じ文字列で同じ正規表現を実行すると、JavaとPerlは異なる結果を返します。ここでJavaとPerlの正規表現が異なる動作をするのはなぜですか?

は、Javaの例です:

public class RegexTest { 
    public static void main(String args[]) { 
     String sentence = "This is a test of regular expressions."; 
     System.out.println(sentence.matches("\\w") ? "Matches" : "Doesn't match"); 
    } 
} 

これが返されます。

と一致していませんここではPerlの例だ:

my $sentence = 'This is a test of regular expressions.'; 
print ($sentence =~ /\w/ ? "Matches" : "Doesn't match") . "\n"; 

これが返されます。私には

にマッチし、 Perlの結果は理にかなっています。これは、1つの単語の文字に一致するものを探します。私はJavaがそれをマッチと見なさない理由を理解していません。違いの理由は何ですか?

答えて

31

Java matchesメソッドは、正規表現がStringと完全一致するかどうかをテストしています。正規表現が文字列のどこにあっても見つかるかどうかを調べるには、Matcherを作成し、そのfindメソッドを使用します。

10

さらに、Perl正規表現構文はNOT Java Regex構文です。

これは必ずしもこの場合は当てはまりませんが、これはあなたのより一般的な質問に対する答えです。

Javaには「PCRE」という正規表現構文があります。つまり、Perl Compatibleです。

しかし、この名前は実際にはPerl互換性がほとんどないため、誤解を招きます。

たとえば、Perlの正規表現では、式自体でコードを実行することができますが、他の多くの高度な演算子や、いくつかの構文は他の言語と同じです(つまり、多くの言語では単語境界として\>\<を使用します)。あなたはPerlRe Documentationの一部を読むのに数分を費やし、Perlの正規表現エンジンができること以外何もできない素晴らしいトリックがたくさんあることがわかります。

+2

PCREは、perlバージョン5の初期にはperlと互換性があり、perl v4であった。わからない。一方、perlの正規表現は前進しています。より一般的な質問(タイトルの1つ)に答えるためには –

+0

+1。私は、Jeffrey Friedlによる 'Mastering Regular Expressions'という本は、共通の正規表現の似たような点と相違点を理解するのに最適だと付け加えたいと思います。 – Jonik

関連する問題