0

今日、英国の郵便番号を検証するために次の正規表現を使用してPerl5Compilerいたレガシーコードのバグに遭遇しました。Perl5Matcher

((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))

ただし、「G12 4NNT」などの郵便番号については正しく検証できませんでした(この場合、最後のセクションは数字とそれに続く2文字のみが許可されます)。java.util.regex.Pattern上記の正規表現を正しく使用し、すべての単体テストに合格するクラスを 使用して、これを修正しました。

しかし、なぜそれがうまくいかなかったのか興味がありPerl5ます。2つのAPIで使用される正規表現構文と基本的な違いはありますか?

4

1 に答える 1

2

問題は上記のリンクされた回答の質問と同じだと思います。

Javaで使用する場合、matches()メソッドは次のとおりです。

text.matches("((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))");

これは完全な文字列と一致します。Perlで同じ動作をするには、式の周りにアンカーを付ける必要があります。

^((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))$

^文字列の先頭に一致します

$文字列の終わりに一致します

于 2013-03-07T15:13:03.790 に答える