Каков окончательный почтовый индекс и регулярное выражение почтового индекса?


201

Я ищу окончательный почтовый индекс и регулярное выражение почтового индекса. Я ищу что-то, что охватит большую часть (надеюсь, весь мир).


4
Одно регулярное выражение для всех почтовых индексов было бы бесполезно в большинстве случаев, не говоря уже о необходимости большого количества кодировки Юникода. Гораздо лучше проверять регулярные выражения для каждой страны, чтобы вы не проверяли правильность таких вещей, как «Нью-Йорк, Нью-Йорк AF23Q».
Да, это Джейк.

101
У тебя проблемы. Вы пишете регулярное выражение для этого. Теперь у вас есть две проблемы.
Роберт С.

regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 для проверки поля, перейдите сюда
Динеш Кумар

2
Тот, который обрабатывает все возможные будущие ценности.
Джодрелл

Ответы:


127

Здесь ничего нет.

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

То, что вы могли бы сделать (теоретически), это создать отдельное регулярное выражение для каждой страны в мире, не рекомендуется ИМО. Но вы все равно пропустите часть проверки: почтовый индекс 12345может существовать, но 12346, может быть, 12344и не существует. Как вы можете проверить это с помощью регулярного выражения?

Ты не можешь


Я подозреваю, что регулярное выражение может быть скомпилировано, но такая задача намного лучше подходит для базы данных. Регулярное выражение будет выглядеть примерно как 10000 | 10001 | 10002 | 10003 | .......
Kibbee

для проверки поля перейдите сюда regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Динеш Кумар

Сначала вы можете использовать регулярное выражение, соответствующее вашей стране (см. En.wikipedia.org/wiki/List_of_postal_codes ), и выполнить реальную проверку внешней службой, такой как geonames.org/export/ws-overview.html
SimonSimCity

3
Мои два цента: в Бразилии это действительно 8 цифр, 5 следуют за тире и еще 3
Хорхе Кампос

^\d{5}(?:[-\s]\d{4})?$
Аамир Африди

261

Юникод CLDR содержит регулярное выражение для каждой страны. (Всего 158 регулярных выражений!)

У Google также есть веб-сервис с информацией о форматировании адресов для каждой страны, включая почтовые индексы, здесь - http://i18napis.appspot.com/address (я нашел эту ссылку через http://unicode.org/review/pri180/ ).

редактировать

Вот копия регулярного выражения postalCodeData.xml :

"GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}"
"JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"US", "\d{5}([ \-]\d{4})?"
"CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d"
"DE", "\d{5}"
"JP", "\d{3}-\d{4}"
"FR", "\d{2}[ ]?\d{3}"
"AU", "\d{4}"
"IT", "\d{5}"
"CH", "\d{4}"
"AT", "\d{4}"
"ES", "\d{5}"
"NL", "\d{4}[ ]?[A-Z]{2}"
"BE", "\d{4}"
"DK", "\d{4}"
"SE", "\d{3}[ ]?\d{2}"
"NO", "\d{4}"
"BR", "\d{5}[\-]?\d{3}"
"PT", "\d{4}([\-]\d{3})?"
"FI", "\d{5}"
"AX", "22\d{3}"
"KR", "\d{3}[\-]\d{3}"
"CN", "\d{6}"
"TW", "\d{3}(\d{2})?"
"SG", "\d{6}"
"DZ", "\d{5}"
"AD", "AD\d{3}"
"AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?"
"AM", "(37)?\d{4}"
"AZ", "\d{4}"
"BH", "((1[0-2]|[2-9])\d{2})?"
"BD", "\d{4}"
"BB", "(BB\d{5})?"
"BY", "\d{6}"
"BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}"
"BA", "\d{5}"
"IO", "BBND 1ZZ"
"BN", "[A-Z]{2}[ ]?\d{4}"
"BG", "\d{4}"
"KH", "\d{5}"
"CV", "\d{4}"
"CL", "\d{7}"
"CR", "\d{4,5}|\d{3}-\d{4}"
"HR", "\d{5}"
"CY", "\d{4}"
"CZ", "\d{3}[ ]?\d{2}"
"DO", "\d{5}"
"EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?"
"EG", "\d{5}"
"EE", "\d{5}"
"FO", "\d{3}"
"GE", "\d{4}"
"GR", "\d{3}[ ]?\d{2}"
"GL", "39\d{2}"
"GT", "\d{5}"
"HT", "\d{4}"
"HN", "(?:\d{5})?"
"HU", "\d{4}"
"IS", "\d{3}"
"IN", "\d{6}"
"ID", "\d{5}"
"IL", "\d{5}"
"JO", "\d{5}"
"KZ", "\d{6}"
"KE", "\d{5}"
"KW", "\d{5}"
"LA", "\d{5}"
"LV", "\d{4}"
"LB", "(\d{4}([ ]?\d{4})?)?"
"LI", "(948[5-9])|(949[0-7])"
"LT", "\d{5}"
"LU", "\d{4}"
"MK", "\d{4}"
"MY", "\d{5}"
"MV", "\d{5}"
"MT", "[A-Z]{3}[ ]?\d{2,4}"
"MU", "(\d{3}[A-Z]{2}\d{3})?"
"MX", "\d{5}"
"MD", "\d{4}"
"MC", "980\d{2}"
"MA", "\d{5}"
"NP", "\d{5}"
"NZ", "\d{4}"
"NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?"
"NG", "(\d{6})?"
"OM", "(PC )?\d{3}"
"PK", "\d{5}"
"PY", "\d{4}"
"PH", "\d{4}"
"PL", "\d{2}-\d{3}"
"PR", "00[679]\d{2}([ \-]\d{4})?"
"RO", "\d{6}"
"RU", "\d{6}"
"SM", "4789\d"
"SA", "\d{5}"
"SN", "\d{5}"
"SK", "\d{3}[ ]?\d{2}"
"SI", "\d{4}"
"ZA", "\d{4}"
"LK", "\d{5}"
"TJ", "\d{6}"
"TH", "\d{5}"
"TN", "\d{4}"
"TR", "\d{5}"
"TM", "\d{6}"
"UA", "\d{5}"
"UY", "\d{5}"
"UZ", "\d{6}"
"VA", "00120"
"VE", "\d{4}"
"ZM", "\d{5}"
"AS", "96799"
"CC", "6799"
"CK", "\d{4}"
"RS", "\d{6}"
"ME", "8\d{4}"
"CS", "\d{5}"
"YU", "\d{5}"
"CX", "6798"
"ET", "\d{4}"
"FK", "FIQQ 1ZZ"
"NF", "2899"
"FM", "(9694[1-4])([ \-]\d{4})?"
"GF", "9[78]3\d{2}"
"GN", "\d{3}"
"GP", "9[78][01]\d{2}"
"GS", "SIQQ 1ZZ"
"GU", "969[123]\d([ \-]\d{4})?"
"GW", "\d{4}"
"HM", "\d{4}"
"IQ", "\d{5}"
"KG", "\d{6}"
"LR", "\d{4}"
"LS", "\d{3}"
"MG", "\d{3}"
"MH", "969[67]\d([ \-]\d{4})?"
"MN", "\d{6}"
"MP", "9695[012]([ \-]\d{4})?"
"MQ", "9[78]2\d{2}"
"NC", "988\d{2}"
"NE", "\d{4}"
"VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?"
"PF", "987\d{2}"
"PG", "\d{3}"
"PM", "9[78]5\d{2}"
"PN", "PCRN 1ZZ"
"PW", "96940"
"RE", "9[78]4\d{2}"
"SH", "(ASCN|STHL) 1ZZ"
"SJ", "\d{4}"
"SO", "\d{5}"
"SZ", "[HLMS]\d{3}"
"TC", "TKCA 1ZZ"
"WF", "986\d{2}"
"XK", "\d{5}"
"YT", "976\d{2}"

3
Просто с помощью быстрого сканирования регулярного выражения почтового индекса AU ... это регулярное выражение очень просто и пропустит множество ложных срабатываний, поэтому оно не является исчерпывающим.
Тарын Ист

7
Последняя версия Unicode CLDR, содержащая регулярное выражение почтового индекса, - это версия 26.0.1. В более поздних версиях он был удален, потому что данные не были сохранены, и никаких других надежных источников найти не удалось.
KIKO Software

1
То же самое, очень основное для французского регулярного выражения почтового индекса. Используйте это "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Винсент Д.

Я сейчас использую i18napis.appspot.com/address/data/GB ; Есть ли проблемы с этим сервисом?
мгол

1
Небольшое исправление комментария @ kiko-software: последняя версия, содержащая данные почтового индекса - 27.0.3 .
Sietse

89

использовать эти regx

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$",
    "DE"=>"\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$",
    "IT"=>"^(V-|I-)?[0-9]{5}$",
    "AU"=>"^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$",
    "NL"=>"^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$",
    "ES"=>"^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$",
    "DK"=>"^([D|d][K|k]( |-))?[1-9]{1}[0-9]{3}$",
    "SE"=>"^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$",
    "BE"=>"^[1-9]{1}[0-9]{3}$",
    "IN"=>"^\d{6}$"
);

7
Одна из лучших попыток, которые я видел, на самом деле ответить на ОП. Становитесь медленнее по мере того, как вы рекламируете больше, но подход чистый и ясный.
Роб

3
Это не становится медленнее, когда вы добавляете больше, как предлагает Роб, поскольку вы выбрали бы одно из регулярных выражений из кода страны.
Thomaschaaf

2
Я вижу, вы опубликовали это в 2012 году. Есть еще с тех пор?
rybo111

@ rybo111 проверьте ответ Чи.
Джулио Качинь

5
@ ddunn801, (есть огромная разница) между проверкой шаблона и аутентификацией почтового кода. Аутентификация кодов на целые порядки сложнее, поскольку (по крайней мере, в США) почтовые коды добавляются и регулярно удаляются. В идеальном мире вы должны выполнить быструю проверку, чтобы проверить шаблон перед отправкой в ​​службу (например, USPS), чтобы проверить весь почтовый адрес (услуги, подобные этой, являются платными, вам не хотелось бы тратить значение на неверные данные ). Увы, мир далек от идеала.
JBH

48
  1. Каждая система почтовых индексов использует только AZ и / или 0-9 и иногда пробел / тире

  2. Не каждая страна использует почтовые индексы (например, Ирландия за пределами Дублина), но мы проигнорируем это здесь.

  3. Самый короткий формат почтового индекса - Сьерра-Леоне с NN

  4. Самым длинным является Американское Самоа с NNNNN-NNNNNN

  5. Вы должны позволить один пробел или тире.

  6. Не должно начинаться или заканчиваться пробелом или тире

Это должно охватывать вышеупомянутое:

(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$

8
Похоже, это единственный ответ, который обеспечивает проверку работоспособности (что, вероятно, то, что хотел ОП), а не полную проверку каждой возможной комбинации. Именно то, что я хотел thx
Lukos

1
@GiulioCaccin H0H0H0 - действительный канадский почтовый код (который дети используют для получения писем от Канадской почты, притворяющимся Санта-Клаусом), но это не значит, что это действительный почтовый индекс клиента :)
Нил Макгиган

2
К вашему сведению, Американское Самоа достаточно мало, чтобы иметь только один почтовый индекс, и его 96799
naterkane

5
На мой взгляд, это единственный хороший ответ. Он может универсально использоваться, например, в качестве предварительной проверки в атрибуте шаблона HTML.
Blackbam

2
Я думаю, что это хороший ответ для ситуации, когда кто-то просто хочет пройти проверку вменяемости, а не проводить точную проверку по каждой стране. Просто чтобы получить немного более чистых данных без особых усилий - в случаях, когда требуется полная безопасность, может потребоваться сторонний плагин / сервис, как указали другие.
Йо Людке

17

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

Не говоря уже о моем собственном роге, но я написал несколько довольно подробных регулярных выражений, которые могут оказаться полезными.

  • Канадские почтовые индексы

    Basic validation:
    ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
    
    Extended validation:
    ^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  • Почтовые индексы США

    ^[0-9]{5}(-[0-9]{4})?$
  • Почтовые индексы Великобритании

    ^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$

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


Расширенная версия для канадских почтовых кодов может содержать что-то неправильное или отсутствующее, поскольку в нем говорится, что следующий почтовый индекс недействителен: E3G 0A1, хотя и является действительным.
fsschmitt

Я проверил все 845 495 почтовых кодов в Канаде, и в этой строке регулярного выражения есть некоторые исправления в расширенной проверке для поддержки всех этих почтовых кодов. Вот новая строка регулярного выражения для расширенной проверки на канадских почтовых кодах: pastebin.com/vazqFKy4
fsschmitt

14

Это похоже на хорошую ссылку, хотя это не в Regex.

На самом деле, если вы на самом деле не отправляете что-то своим пользователям, я не думаю, что это стоит усилий. А если будут грузить его, есть адрес чистящие средства / услуги , которые вы можете посмотреть в , чтобы сделать его намного легче на себя.


Кроме того, даже если это правильный почтовый индекс сегодня, он вполне может измениться в будущем. USPS постоянно добавляет новые и разделяет области. Единственный способ, которым вы можете быть в курсе, - это проверить в тот момент, когда вы действительно что-то отправляете. Некоторые города даже решили изменить свой собственный почтовый индекс по разным причинам.
NotMe

Похоже, кто-то взял вики-статью, которую вы опубликовали выше, и вывел ее в JSON с регулярным выражением почтового / почтового индекса для каждой страны - gist.github.com/matthewbednarski/…
Крис Смит,

8

Мы используем следующее:

Канада

([A-Z]{1}[0-9]{1}){3}   //We raise to upper first

Америка

[0-9]{5}                //-or-
[0-9]{5}-[0-9]{4}       //10 digit zip

Другой

Принять как есть


1
Я бы предложил добавить опциональный - [0-9] {4} к США. Некоторые люди используют свои ZIP + 4.
Дэвид Торнли

4
/ [0-9] {5} (?: - [0-9] {4})? / / Позволяет вам проверить оба стиля из США одновременно.
час. Оуэнс

2
@ Chas.Owens, добавляя ^ и $, гарантируют, что они не смогут вводить что-либо еще до или после, например "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Тим Франклин

7

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


6
.* 

Big Jump забыл про разрывы строк, пробелы и управляющие символы.

Международные почтовые индексы являются своего рода проблемой остановки.


6

Обращаем ваше внимание, что это довольно сложная проблема, о чем свидетельствует принятый ответ. Я думаю, что это не остановило людей на geonames.org . У них есть файл с информацией о стране , который не полностью вписывается в этот ответ - очевидно, ограничение составляет 30000 символов. Есть регулярные выражения для около 150 стран.

Я извлек биты, имеющие отношение к этому вопросу здесь:

AD ^(?:AD)*(\d{3})$
AM ^(\d{6})$
AR ^([A-Z]\d{4}[A-Z]{3})$
AT ^(\d{4})$
AU ^(\d{4})$
AX ^(?:FI)*(\d{5})$
AZ ^(?:AZ)*(\d{4})$
BA ^(\d{5})$
BB ^(?:BB)*(\d{5})$
BD ^(\d{4})$
BE ^(\d{4})$
BG ^(\d{4})$
BH ^(\d{3}\d?)$
BM ^([A-Z]{2}\d{2})$
BN ^([A-Z]{2}\d{4})$
BR ^(\d{8})$
BY ^(\d{6})$
CA ^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$
CH ^(\d{4})$
CL ^(\d{7})$
CN ^(\d{6})$
CR ^(\d{4})$
CU ^(?:CP)*(\d{5})$
CV ^(\d{4})$
CX ^(\d{4})$
CY ^(\d{4})$
CZ ^(\d{5})$
DE ^(\d{5})$
DK ^(\d{4})$
DO ^(\d{5})$
DZ ^(\d{5})$
EC ^([a-zA-Z]\d{4}[a-zA-Z])$
EE ^(\d{5})$
EG ^(\d{5})$
ES ^(\d{5})$
ET ^(\d{4})$
FI ^(?:FI)*(\d{5})$
FM ^(\d{5})$
FO ^(?:FO)*(\d{3})$
FR ^(\d{5})$
GB ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GE ^(\d{4})$
GF ^((97|98)3\d{2})$
GG ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GL ^(\d{4})$
GP ^((97|98)\d{3})$
GR ^(\d{5})$
GT ^(\d{5})$
GU ^(969\d{2})$
GW ^(\d{4})$
HN ^([A-Z]{2}\d{4})$
HR ^(?:HR)*(\d{5})$
HT ^(?:HT)*(\d{4})$
HU ^(\d{4})$
ID ^(\d{5})$
IL ^(\d{5})$
IM ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
IN ^(\d{6})$
IQ ^(\d{5})$
IR ^(\d{10})$
IS ^(\d{3})$
IT ^(\d{5})$
JE ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
JO ^(\d{5})$
JP ^(\d{7})$
KE ^(\d{5})$
KG ^(\d{6})$
KH ^(\d{5})$
KP ^(\d{6})$
KR ^(?:SEOUL)*(\d{6})$
KW ^(\d{5})$
KZ ^(\d{6})$
LA ^(\d{5})$
LB ^(\d{4}(\d{4})?)$
LI ^(\d{4})$
LK ^(\d{5})$
LR ^(\d{4})$
LS ^(\d{3})$
LT ^(?:LT)*(\d{5})$
LU ^(\d{4})$
LV ^(?:LV)*(\d{4})$
MA ^(\d{5})$
MC ^(\d{5})$
MD ^(?:MD)*(\d{4})$
ME ^(\d{5})$
MG ^(\d{3})$
MK ^(\d{4})$
MM ^(\d{5})$
MN ^(\d{6})$
MQ ^(\d{5})$
MT ^([A-Z]{3}\d{2}\d?)$
MV ^(\d{5})$
MX ^(\d{5})$
MY ^(\d{5})$
MZ ^(\d{4})$
NC ^(\d{5})$
NE ^(\d{4})$
NF ^(\d{4})$
NG ^(\d{6})$
NI ^(\d{7})$
NL ^(\d{4}[A-Z]{2})$
NO ^(\d{4})$
NP ^(\d{5})$
NZ ^(\d{4})$
OM ^(\d{3})$
PF ^((97|98)7\d{2})$
PG ^(\d{3})$
PH ^(\d{4})$
PK ^(\d{5})$
PL ^(\d{5})$
PM ^(97500)$
PR ^(\d{9})$
PT ^(\d{7})$
PW ^(96940)$
PY ^(\d{4})$
RE ^((97|98)(4|7|8)\d{2})$
RO ^(\d{6})$
RS ^(\d{6})$
RU ^(\d{6})$
SA ^(\d{5})$
SD ^(\d{5})$
SE ^(?:SE)*(\d{5})$
SG ^(\d{6})$
SH ^(STHL1ZZ)$
SI ^(?:SI)*(\d{4})$
SK ^(\d{5})$
SM ^(4789\d)$
SN ^(\d{5})$
SO ^([A-Z]{2}\d{5})$
SV ^(?:CP)*(\d{4})$
SZ ^([A-Z]\d{3})$
TC ^(TKCA 1ZZ)$
TH ^(\d{5})$
TJ ^(\d{6})$
TM ^(\d{6})$
TN ^(\d{4})$
TR ^(\d{5})$
TW ^(\d{5})$
UA ^(\d{5})$
US ^\d{5}(-\d{4})?$
UY ^(\d{5})$
UZ ^(\d{6})$
VA ^(\d{5})$
VE ^(\d{4})$
VI ^\d{5}(-\d{4})?$
VN ^(\d{6})$
WF ^(986\d{2})$
YT ^(\d{5})$
ZA ^(\d{4})$
ZM ^(\d{5})$
CS ^(\d{5})$

Надеюсь, я не ошибся, мое регулярное выражение довольно слабое.


1
Я хотел бы отметить, что регулярное выражение для Франции и Великобритании не учитывает возможные пробелы; Во Франции почтовые индексы можно вводить с пробелом между второй и третьей цифрами (то есть 75 001 вместо 75001). Британские почтовые индексы довольно часто пишутся с пробелом (то есть SW1 1AA вместо SW11AA).
Salcoin

@salcoin Спасибо за вклад, я этого не заметил (хотя я француз). Похоже, что ответ Чи лучше в этом отношении.
ня

потому что str_replace пробел без пробела супер налог, верно? : p
Роберт Паундер

6

Если кто-то все еще интересуется, как проверить почтовые индексы, я нашел решение:

Используя Google Geocoding APIмы можем проверить действительность почтового индекса, имеющего как код страны, так и сам почтовый индекс.

Например, я живу в Украине, поэтому я могу проверить это следующим образом: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Или используя JS API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Где 80380действителен ZIP для Украины, фактически каждый (#####) действителен.

Google возвращает ZERO_RESULTSстатус, если ничего не найдено. Или OKи результат, если оба верны.

Надеюсь, это будет полезно.


Единственной проблемой будет ограничение на количество запросов, которое, в зависимости от сайта / размера, может быть проблемой.
Дэррил Хейн

@DarrylHein конечно, но теперь это довольно большая цена, чтобы заставить его работать =)
Ромко

4

Как уже отмечали другие, одно правило для управления ими всеми маловероятно. Тем не менее, вы можете создавать регулярные выражения для любого количества стран, используя необходимую информацию о форматировании адресов из Универсального почтового союза - малоизвестного агентства ООН.

Например, вот несколько правил форматирования адресов, включая почтовый индекс, для нескольких стран (формат PDF):


2

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

Обе компании предоставляют возможности поиска адресов через программируемый API.


1

Почему ты это делаешь и почему тебя это волнует? Как отметил Том Риттер, не имеет значения, есть ли у вас вообще какой-либо почтовый индекс, тем более, действительный он или нет, до тех пор, пока вы действительно не собираетесь отправлять что-либо по этому адресу. Даже если вы ожидаете, что когда-нибудь отправите им что- нибудь , это не значит, что вам нужен почтовый индекс сегодня .


Да, но если они собираются войти в него, с тем же успехом можно убедиться, что это правильно в тот момент. Тем не менее, я согласен с одним из других ответов, который в основном гласит: сделайте его валидным для стран, которые, по вашему мнению, будут составлять большинство ваших клиентов.
cdmckay

1
Некоторые кредитные клиринговые палаты не примут счет, если почтовый индекс указан правильно. Я предпочел бы проверить почтовый индекс на входе, а не представлять обвинение и отклонить его.
SamGoody

1

Как уже отмечалось, вариации по всему миру огромны. И даже если что-то, что соответствует шаблону, не означает, что оно существует.

Тогда, конечно, есть много мест, где почтовые индексы не используются (например, много или Ирландия).


На самом деле, вероятно, вся Ирландия, так как я не думаю, что D1, D2 и т. Д. Считаются правильными почтовыми индексами, поскольку вы не можете идентифицировать адрес, используя только этот код и номер улицы.
День

1

Для точного почтового индекса существуют и другие причины, помимо доставки. Турагентства, совершающие туры, которые пересекают границы (за исключением Еврозоны, конечно), должны заблаговременно предоставить эту информацию властям. Часто эта информация вводится агентом, который может или не может быть знаком с такими вещами. ЛЮБОЙ метод, который может сократить количество ошибок - это Good Idea ™

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


1
Это только хорошая идея, пока код не начнет отклонять действительные почтовые индексы либо потому, что он содержит ошибки, либо почтовые индексы изменились. Валидация - это то, что должно быть либо правильным, либо его нет вообще. По крайней мере, должна быть опция переопределения.
час. Оуэнс

1

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

[0-9a-zA-Z]+

Лучше всего идти по довольно широкой схеме (ну, не так широко, как указано выше), или относиться к каждой стране / региону со своей собственной структурой!

ОБНОВЛЕНИЕ: Тем не менее, может быть возможно динамически построить регулярное выражение, основанное на множестве более мелких, специфичных для региона правил - хотя и не уверен в производительности!

На сайте RegExLib можно найти множество шаблонов для конкретных стран .


1

Кто-то спрашивал о списке форматирования почтовых адресов, и я думаю, это то, что он искал ...

Обязательное руководство Фрэнка по почтовым адресам: http://www.columbia.edu/~fdc/postal/ Однако мало помогает в решении проблем на уровне улиц.

Моя работа использует несколько инструментов, чтобы помочь с этим: - Сервисы Lexis-Nexis, включая поиск NCOA (вы получите стандартизацию адресов бесплатно) - «Melissa Data» http://www.melissadata.com


1

Это очень простой RegEx для проверки почтового индекса США (не ZipCode Plus Four):

(?!([089])\1{4})\d{5}

Кажется , все пять значного являются действительными , кроме Почтовые индексы 00000, 88888& 99999.

Я проверил этот RegEx с http://regexpal.com/

SP


Этот RegEx не применяет четыре цифры для части zip + 4. Например, он считает "92122-1" действительным почтовым индексом.
Сенсей Джеймс

0

Если Zip Codeразрешены символы и цифры (алфавитно-цифровые), то здесь используется регулярное выражение, где оно совпадает, 5, 9 или 10 буквенно-цифровых символов с одним переносом ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.