2008年3月23日日曜日

JavaのRegexのパターンマッチがうまくいかない?

明らかに小ネタな話であるが、PHPとかのつもりでJavaのRegexでパターンマッチさせると、マッチしないと勘違いするかもしれないという話。
Javaで単純にRegexに文字列がマッチしているか否かを知るには、以下のようなコードを使う。

  • java.lang.String str = "…";
    str.matches(regex);
  • java.util.regex.Pattern.matches(regex, str);
  • java.util.regex.Pattern pattern = java.util.regex.Pattern.complie(regex);
    java.util.regex.Matcher matcher = pattern.matcher(str);
    matcher.matches();

いずれにしろ、java.util.regex.Patternがregexで記述されたパターンを処理している。

ところで、PHPでパターンマッチさせるときには、だいたい、PCRE(Perl互換正規表現)を使うわけだが、そこで単純なパターンマッチは、pcre_match(pattern, str);となる。
例えば、文字列の先頭が"prefx"という文字列で始まっているかどうかを知るには、PHPではpcre_match('/^prefix/', str) > 0と書く。

そこで、同じ感じでJavaで書くと、java.util.regex.Pattern.matches("^prefix", str);と書きたくなる。しかし、こう書いてしまうとうまくマッチしてくれないのである。
それは、Regexでは、パターンに完全にマッチしてないとだめなのである。

すなわち、Javaではjava.util.regex.Pattern.matches("^prefix.*", str);と書いてあげないとマッチしないということになる。

0 件のコメント: