2017-10-28 20 views
0

正規表現のパターンsupplied by the British governmentを使用して英国の郵便番号を検証しています。私のテストは現在、次のようになります。正規表現で文字列全体を一致させる

const postcodeRegex = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$/g; 

console.log(postcodeRegex.test('s75ed')); // returns true 
console.log(postcodeRegex.test('s75ed555555')); // returns false 
console.log(postcodeRegex.test('555555s75ed')); // returns true 

最初の2つのコンソールログは正しいですが、私は第三はfalseを返すように期待しました。テストは文字列の最後にパターンが一致したときにtrueを返しますが、文字列の先頭にはひらめきがあります。つまり、文字列全体が無効な郵便番号になります。

文字列全体にパターンを厳密に一致させるにはどうすればよいですか?

+0

は、英国政府から直接コピーこのパターンですか?もしそうなら、私は彼らがこれを適切にテストしていないことに驚いています。 o) – agrm

+0

@agrmはい.govウェブサイトに公開された文書から直接です。信じられないことに私は知っているが、それは政府がしていることのようなものだ。 – Coop

+0

@agrm PDFへのリンクを追加しました。 – melpomene

答えて

3

あなたの正規表現は、この形状を有しています。 これはAgibberishgibberishBと一致するとは思わなかったのですが、実際には^(A|B)$を探しています。 これはAまたはBと一致し、 と一致しません。AgibberishgibberishBと一致しません。

Btw正規表現のこの部分は、バグのようです:[AZa-z]。 おそらく[A-Za-z]を意味します。

実際、正規表現内のすべてのアルファベット文字は、大文字と小文字の両方の形式で表示されます。あなたがiフラグを追加し、例1を排除するのであれば、あなたはかなりによって簡素化することができます:

const postcodeRegex = /^((gir 0a{2})|((([a-z][0-9]{1,2})|(([a-z][a-hj-y][0-9]{1,2})|(([a-z][0-9][a-z])|([a-z][a-hj-y][0-9]?[a-z]))))[0-9][a-z]{2}))$/gi; 
+0

偉大な、これは私が思ったよりも多くの問題を解決します。政府に、これに対して間違ったパターンを提供することを信頼してください。 – Coop

+0

訂正された正規表現でさえ、郵便番号を完全に検証しません。 Qのような一部の文字は、最初の位置に表示されません。私が使用したことのない文字。特定の組み合わせのみ有効です。地区Gは最初のポジションでは問題ありませんが、GL、GU、GYのみが第2文字で有効です。等々。 – Nick

2

我々はいくつかの空白やインデントを追加する場合は、あなたの正規表現は次のようになります。

^([Gg][Ii][Rr] 0[Aa]{2}) 
| 
    ((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$ 

すなわち、最初の選択肢のみが文字列の先頭に固定され(^)、2番目の選択肢のみが文字列の末尾に固定されます($)。

あなたが代わりに(非キャプチャ)グループ内の全部をラップすることができます:^A|B$

^(?:...|...)$ 
+1

賢明な、新しいグループ化は問題を解決するようです。私は英国政府がこのために不正な正規表現のパターンを公に共有しているのに驚いています...少し待って、私はまったく驚いていません。 – Coop

関連する問題