Regex для проверки почтовых индексов Великобритании

У меня есть приложение, которое использует следующее регулярное выражение для проверки почтовых кодов Великобритании.

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})

Если я правильно понимаю это регулярное выражение, разрешенные почтовые коды должны быть следующими:

GIR 0AA

Или тогда мы можем составить первую часть почтового индекса следующим образом:

Или

ANN (where A is any letter except for QVX and N is any number)

или

ABNN (where A is any letter except for QVX, B any letter except for IJZ and N is any number)

или

ANC (where A is any letter except for QVX, N is any number and C is any letter from A-H and then J, K, S, T, U, W)

или

ABND (where A is any letter except for QVX, B any letter except for IJZ, N is any number and D can be any of ABEHMNPRVWXY)

Вторая часть почтового индекса

NEE (where N is any number and E is any letter except for any of CIKMOV)

Это мое понимание вышеизложенного регулярного выражения.

Я не могу понять, почему это позволяет aaa1 1aa or aaa11 1aa

Любые идеи?

13.10.2009 11:56:20
3 ОТВЕТА

Вы не привязали его к началу и концу строки (^ и $)

^((GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}))$
4
13.10.2009 11:59:36

В дополнение к привязке: я не знаю, какой диалект regex вы используете, но я никогда не встречал такой, где этот синтаксис:

[A-Z-[QVX]]

исключает символы QVX, как вы, кажется, хотите. В большинстве регулярных выражений это будет разрешающий класс символов A-Z-[, за которым следует буквальная закрывающая квадратная скобка. Чтобы исключить QVX, вы должны сказать:

[A-PR-UWYZ]

В любом случае, обычно не стоит «проверять» почтовые индексы полностью; почтовые индексы - более хитрый зверь, чем многие думают, особенно если вы хотите разрешить исторические почтовые индексы и странности, такие как почтовые индексы BFPO (которые вы в данный момент, похоже, игнорируете). Вы также не хотите обновлять свой код, если и когда почтовое отделение добавляет новые коды.

Лучше всего использовать простую поверхностную проверку для явно неправильного / отсутствующего ввода; На самом деле это плохая вещь - отказать потенциальному клиенту, потому что вы считаете его адрес недействительным.

3
13.10.2009 12:14:11
Хорошее место! Java имеет что-то подобное, [A-Z&&[^QVX]]соответствует всем заглавным буквам, кроме Q, Vи X, но не так, как пытается OP.
Bart Kiers 13.10.2009 13:04:57

Используйте это регулярное выражение

^ ?(([BEGLMNSWbeglmnsw][0-9][0-9]?)|(([A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][0-9]?)|(([ENWenw][0-9][A-HJKSTUWa-hjkstuw])|([ENWenw][A-HK-Ya-hk-y][0-9][ABEHMNPRVWXYabehmnprvwxy])))) ?[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$
0
24.07.2013 06:43:30