Java の正規表現の実装で予期しない動作を確認しました。と を使用する場合、Matcher のメソッドを使用するjava.util.regex.Pattern
とjava.util.regex.Matcher
、次の正規表現は入力で正しく一致しません。"Merlot"
find()
((?:White )?Zinfandel|Merlot)
最も外側の一致するグループ内の式の順序を変更すると、Matcher のfind()
メソッドは一致します。
(Merlot|(?:White )?Zinfandel)
問題を説明するテスト コードを次に示します。
RegexTest.java
import java.util.regex.*;
public class RegexTest {
public static void main(String[] args) {
Pattern pattern1 = Pattern.compile("((?:White )?Zinfandel|Merlot)");
Matcher matcher1 = pattern1.matcher("Merlot");
// prints "No Match :("
if (matcher1.find()) {
System.out.println(matcher1.group(0));
} else {
System.out.println("No match :(");
}
Pattern pattern2 = Pattern.compile("(Merlot|(?:White )?Zinfandel)");
Matcher matcher2 = pattern2.matcher("Merlot");
// prints "Merlot"
if (matcher2.find()) {
System.out.println(matcher2.group(0));
} else {
System.out.println("No match :(");
}
}
}
予想される出力は次のとおりです。
Merlot
Merlot
しかし、実際の出力は次のとおりです。
No Match :(
Merlot
この予期しない動作が、Ubuntu Linux の Java バージョン 1.7.0_11 と、OSX 10.8.2 の Java バージョン 1.6.0_37 に存在することを確認しました。昨日、この動作をバグとしてOracleに報告したところ、バグ レポートが受信され、内部レビュー ID が 2441589 であることを知らせる自動電子メールが返されました。バグでその ID を検索しても、バグ レポートが見つかりません。データベース。(コオロギの鳴き声が聞こえますか?)
おそらく完全にテストされ、使用されている Java の正規表現実装 (2013 年には信じがたいこと) のバグを発見したのでしょうか、それとも何か間違ったことをしているでしょうか?