Мне нужно регулярное выражение, которое будет проверять полный комплексный почтовый индекс Великобритании только во входной строке. Все необычные формы почтовых индексов должны быть покрыты так же, как и обычные. Например:
Спички
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Не совпадает
- AWC2H 7LT
- WC2H 7LTa
- WC2H
Как мне решить эту проблему?
regex
validation
regex-group
postal-code
Киран Бентон
источник
источник
Ответы:
Я бы рекомендовал взглянуть на стандарт данных правительства Великобритании для почтовых индексов [ссылка сейчас не работает; архив XML , см. Википедию для обсуждения. Существует краткое описание данных, а присоединенная XML-схема содержит регулярное выражение. Это может быть не совсем то, что вы хотите, но будет хорошей отправной точкой. RegEx немного отличается от XML, так как символ P в третьей позиции в формате A9A 9AA допускается данным определением.
RegEx, предоставленный правительством Великобритании, был:
Как указано в обсуждении в Википедии, это позволит использовать некоторые нереальные почтовые индексы (например, те, которые начинаются с AA, ZY), и они предоставляют более строгий тест, который вы можете попробовать.
источник
^([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})$
Похоже, что мы собираемся использовать
^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$
, что является слегка измененной версией, предложенной Minglis выше.Однако нам необходимо выяснить, какие именно правила, поскольку различные решения, перечисленные выше, по-видимому, применяют различные правила в отношении того, какие буквы разрешены.
После некоторых исследований мы нашли еще немного информации. По-видимому, страница на govtalk.gov.uk указывает на спецификацию почтовых индексов govtalk-postcodes . Это указывает на схему XML в XML - схеме , которая обеспечивает «псевдо регулярное выражение» утверждение правил почтовый индекс.
Мы взяли это и немного поработали над этим, чтобы дать нам следующее выражение:
Это делает пробелы необязательными, но ограничивает вас одним пробелом (замените '&' на '{0,} для неограниченных пробелов). Предполагается, что весь текст должен быть в верхнем регистре.
Если вы хотите разрешить строчные буквы с любым количеством пробелов, используйте:
Это не распространяется на заморские территории, а только обеспечивает соблюдение формата, а НЕ на существование различных областей. Он основан на следующих правилах:
Может принимать следующие форматы:
Куда:
С наилучшими пожеланиями
Colin
источник
^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
{0,}
вместо*
неограниченных, необязательных пробелов?Я недавно опубликовал ответ на этот вопрос на британских почтовых индексов для языка R . Я обнаружил, что шаблон регулярных выражений правительства Великобритании неверен и не может правильно проверить некоторые почтовые индексы. К сожалению, многие ответы здесь основаны на этой неправильной схеме.
Я изложу некоторые из этих вопросов ниже и предоставлю исправленное регулярное выражение, которое действительно работает.
Заметка
Мой ответ (и регулярные выражения в целом):
Если вас не интересует плохое регулярное выражение, и вы просто хотите пропустить ответ, прокрутите вниз до раздела « Ответ ».
Плохое регулярное выражение
Регулярные выражения в этом разделе не должны использоваться.
Это ошибочное регулярное выражение, которое правительство Великобритании предоставило разработчикам (не уверен, как долго будет действовать эта ссылка, но вы можете увидеть это в их документации Bulk Data Transfer ):
Проблемы
Проблема 1 - Копировать / Вставить
Смотрите регулярное выражение в использовании здесь .
Как, вероятно, делают многие разработчики, они копируют / вставляют код (особенно регулярные выражения) и вставляют их, ожидая, что они будут работать. Хотя это хорошо в теории, в данном конкретном случае это терпит неудачу, потому что копирование / вставка из этого документа фактически превращает один из символов (пробел) в символ новой строки, как показано ниже:
Первое, что сделает большинство разработчиков, это просто удалите новую строку, не задумываясь. Теперь регулярное выражение не будет сопоставлять почтовые индексы с пробелами в них (кроме
GIR 0AA
почтового индекса).Чтобы решить эту проблему, символ новой строки должен быть заменен символом пробела:
Проблема 2 - Границы
Смотрите регулярное выражение в использовании здесь .
Регулярное выражение почтового индекса неправильно привязывает регулярное выражение. Любой, кто использует это регулярное выражение для проверки почтовых индексов, может быть удивлен, если получится такое значение
fooA11 1AA
. Это потому, что они привязали начало первого и конец второго (независимо друг от друга), как указано в регулярном выражении выше.Это означает, что
^
(утверждает позицию в начале строки) работает только с первым параметром([Gg][Ii][Rr] 0[Aa]{2})
, поэтому второй параметр будет проверять все строки, заканчивающиеся почтовым индексом (независимо от того, что предшествует ранее).Аналогично, первая опция не привязана к концу строки
$
, поэтомуGIR 0AAfoo
также принимается.Чтобы решить эту проблему, оба параметра должны быть заключены в другую группу (или группу без захвата), а вокруг них должны быть размещены якоря:
Проблема 3 - Неправильный набор символов
Смотрите регулярное выражение в использовании здесь .
Регулярное выражение отсутствует
-
здесь, чтобы указать диапазон символов. Как есть, если почтовый индекс имеет форматANA NAA
(гдеA
представляет букву иN
представляет число) и начинается с чего-либо, кромеA
илиZ
, он потерпит неудачу.Это означает, что это будет соответствовать
A1A 1AA
иZ1A 1AA
, но неB1A 1AA
.Чтобы решить эту проблему, символ
-
должен быть помещен междуA
иZ
в соответствующем наборе символов:Проблема 4 - Неправильный дополнительный набор символов
Смотрите регулярное выражение в использовании здесь .
Я клянусь, что они даже не проверяли эту вещь, прежде чем публиковать ее в Интернете. Они сделали неправильный набор символов необязательным. Они сделали
[0-9]
вариант в четвертом подопции варианта 2 (группа 9). Это позволяет регулярному выражению соответствовать неправильно отформатированным почтовым индексамAAA 1AA
.Чтобы решить эту проблему, сделайте следующий класс символов необязательным (и впоследствии сделайте так, чтобы набор
[0-9]
совпадал ровно один раз):Проблема 5 - Производительность
Производительность на этом регулярном выражении крайне плохая. Во-первых, они поместили наименее вероятный вариант шаблона для соответствия
GIR 0AA
в начале. Сколько пользователей будет иметь этот почтовый индекс по сравнению с любым другим почтовым индексом; наверное никогда? Это означает, что каждый раз, когда используется регулярное выражение, он должен сначала исчерпать эту опцию, прежде чем перейти к следующей. Чтобы увидеть, как это влияет на производительность, проверьте количество шагов, которые исходное регулярное выражение (35) предприняло по отношению к тому же регулярному выражению после переключения опций (22).Вторая проблема с производительностью связана с тем, как структурировано все регулярное выражение. Там нет смысла возвращаться к каждому варианту, если один не удастся. Структура текущего регулярного выражения может быть значительно упрощена. Я исправляю это в разделе « Ответ ».
Задача 6 - Пространства
Смотрите регулярное выражение в использовании здесь
Это само по себе не может считаться проблемой , но вызывает беспокойство у большинства разработчиков. Пробелы в регулярном выражении не являются обязательными, это означает, что пользователи, вводящие свои почтовые индексы, должны поместить пробел в почтовый индекс. Это легко исправить, просто добавив
?
после пробелов сделать их необязательными. Смотрите раздел Ответ для исправления.Ответ
1. Исправление регулярного выражения правительства Великобритании
Исправление всех проблем, описанных в разделе « Проблемы » и упрощение шаблона, дает следующий, более короткий и более лаконичный шаблон. Мы также можем удалить большинство групп, так как мы проверяем почтовый индекс в целом (не отдельные части):
Смотрите регулярное выражение в использовании здесь
Это может быть дополнительно сокращено путем удаления всех диапазонов из одного из регистров (верхнего или нижнего регистра) и использования флага без учета регистра. Примечание . Некоторые языки не имеют такового, поэтому используйте более длинный выше. Каждый язык реализует флаг нечувствительности к регистру по-своему.
Смотрите регулярное выражение в использовании здесь .
Короче снова заменить
[0-9]
на\d
(если ваш движок регулярных выражений поддерживает это):Смотрите регулярное выражение в использовании здесь .
2. Упрощенные шаблоны
Без указания конкретных буквенных символов можно использовать следующее (имейте в виду, что здесь были использованы упрощения, приведенные в разделе 1. Исправление регулярного выражения правительства Великобритании ):
Смотрите регулярное выражение в использовании здесь .
И даже дальше, если вас не волнует особый случай
GIR 0AA
:3. Сложные паттерны
Я не рекомендовал бы чрезмерную проверку почтового индекса, поскольку новые районы, районы и районы могут появиться в любой момент времени. Что я буду предлагать делать потенциально , так это добавлена поддержка для крайних случаев. Существуют некоторые особые случаи, которые описаны в этой статье Википедии .
Вот сложные регулярные выражения, которые включают в себя подразделы 3. (3.1, 3.2, 3.3).
Относительно моделей в 1. Исправление регулярного выражения правительства Великобритании :
Смотрите регулярное выражение в использовании здесь
И по отношению к 2. Упрощенные паттерны :
Смотрите регулярное выражение в использовании здесь
3.1 Британские заморские территории
Статья в Википедии в настоящее время утверждает (некоторые форматы немного упрощены):
AI-1111
: АнгильяASCN 1ZZ
: Остров ВознесенияSTHL 1ZZ
: Святой ЕленыTDCU 1ZZ
Тристан-да-КуньяBBND 1ZZ
: Британская территория Индийского океанаBIQQ 1ZZ
: Британская Антарктическая ТерриторияFIQQ 1ZZ
: Фолклендские островаGX11 1ZZ
: ГибралтарPCRN 1ZZ
: Острова ПиткэрнSIQQ 1ZZ
: Южная Георгия и Южные Сандвичевы островаTKCA 1ZZ
: Острова Теркс и КайкосBFPO 11
: Акротири и ДекелияZZ 11
&GE CX
: Бермудские острова (согласно этому документу )KY1-1111
: Каймановы острова (согласно этому документу )VG1111
: Британские Виргинские острова (согласно этому документу )MSR 1111
: Монтсеррат (согласно этому документу )Всеобъемлющее регулярное выражение для соответствия только британским заморским территориям может выглядеть так:
Смотрите регулярное выражение в использовании здесь .
3.2 Почтовое отделение британских войск
Хотя они были недавно изменены, чтобы лучше соответствовать британской системе почтовых индексов
BF#
(где#
представляет число), они считаются необязательными альтернативными почтовыми индексами . Эти почтовые индексы следуют (ed) форматBFPO
, за которым следуют 1-4 цифры:Смотрите регулярное выражение в использовании здесь
3.3 Санта?
Есть еще один особый случай с Сантой (как уже упоминалось в других ответах):
SAN TA1
это действительный почтовый индекс. Регулярное выражение для этого очень просто:источник
Не существует такого понятия, как всеобъемлющее регулярное выражение почтового индекса в Великобритании, способное проверять почтовый индекс. Вы можете проверить, что почтовый индекс имеет правильный формат, используя регулярное выражение; не то, чтобы это на самом деле существует.
Почтовые индексы произвольно сложны и постоянно меняются. Например, исходящий код
W1
не имеет и не может иметь каждый номер от 1 до 99 для каждой области почтового индекса.Вы не можете ожидать, что то, что там в настоящее время, будет правдой навсегда. Например, в 1990 году почтамт решил, что в Абердине становится немного тесно. Они добавили 0 к концу AB1-5, сделав его AB10-50, а затем создали несколько почтовых индексов между ними.
Всякий раз, когда строится новая улица, создается новый почтовый индекс. Это часть процесса получения разрешения на строительство; местные власти обязаны держать это в курсе с почтовым отделением (не то, что они все делают).
Кроме того, как отметили некоторые другие пользователи, есть специальные почтовые индексы, такие как Girobank, GIR 0AA, и один для писем Санте, SAN TA1 - вы, вероятно, не хотите ничего публиковать там, но он быть покрыт любым другим ответом.
Затем есть почтовые индексы BFPO, которые теперь меняются на более стандартный формат . Оба формата будут действительны. Наконец, есть источник Wikipedia заморских территорий .
Далее, вы должны принять во внимание, что Великобритания «экспортировала» свою систему почтовых индексов во многие места в мире. Все, что проверяет почтовый индекс Великобритании, также будет проверять почтовые индексы ряда других стран.
Если вы хотите проверить почтовый индекс Великобритании, самый безопасный способ сделать это - использовать поиск текущих почтовых индексов. Есть несколько вариантов:
Ordnance Survey выпускает Code-Point Open под лицензией открытых данных. Это будет немного отставать от времени, но это бесплатно. Это (вероятно, я не помню) не будет включать данные по Северной Ирландии, так как Обследование артиллерийских орудий там не имеет никакого отношения. Картографирование в Северной Ирландии проводится Картографическим управлением Северной Ирландии, и у них есть отдельный платный продукт Pointer . Вы можете использовать это и добавить те, которые не покрываются достаточно легко.
Royal Mail выпускает адресный файл почтового индекса (PAF) , в том числе BFPO, но я не уверен, что Code-Point Open делает. Он регулярно обновляется, но стоит денег (и они могут быть откровенно плохими). PAF содержит полный адрес, а не только почтовые индексы, и поставляется с собственным Руководством для программистов . Open User User Group (ODUG) в настоящее время лоббирует выпуск PAF бесплатно, вот описание их позиции .
Наконец, есть AddressBase . Это сотрудничество между Ordnance Survey, Местными властями, Royal Mail и соответствующей компанией для создания окончательного каталога всей информации обо всех адресах в Великобритании (они также были довольно успешными). Он платный, но если вы работаете с местным органом власти, государственным департаментом или государственной службой, он может им пользоваться бесплатно. Там гораздо больше информации, чем просто почтовые индексы.
источник
Я посмотрел некоторые из приведенных выше ответов, и я бы рекомендовал не использовать шаблон из ответа @ Dan (c. 15 декабря 2010 г.) , поскольку он неправильно помечает почти 0,4% действительных почтовых индексов как недействительные, в то время как другие этого не делают. ,
Ordnance Survey предоставляет услугу под названием Code Point Open, которая:
Я проверил каждое из приведенных выше регулярных выражений по полному списку почтовых индексов (6 июля 13 года) по этим данным, используя
grep
:Всего насчитывается 1 686 202 почтовых индексов.
Ниже приведены номера действительных почтовых индексов, которые не соответствуют каждому
$pattern
:Конечно, эти результаты имеют дело только с действительными почтовыми индексами, которые неправильно помечены как недействительные. Так:
Я ничего не говорю о том, какой шаблон лучше всего подходит для фильтрации недействительных почтовых индексов.
источник
http://regexlib.com/REDetails.aspx?regexp_id=260
источник
0-9
которых вы не можетеСогласно этой таблице Википедии
Этот шаблон охватывает все случаи
При использовании на Android \ Java используйте \\ d
источник
Большинство ответов здесь не работает для всех почтовых индексов, которые есть в моей базе данных. Я наконец нашел тот, который проверяет со всеми, используя новое регулярное выражение, предоставленное правительством:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
Этого нет ни в одном из предыдущих ответов, поэтому я публикую его здесь на тот случай, если они отключат ссылку:
ОБНОВЛЕНИЕ: обновленное регулярное выражение, как указано Джейми Буллом. Не уверен, что это была моя ошибка при копировании или ошибка в правительственном регулярном выражении, ссылка сейчас не работает ...
ОБНОВЛЕНИЕ: Как обнаружили ctwheels, это регулярное выражение работает со вкусом регулярных выражений javascript. Смотрите его комментарий, который работает со вкусом pcre (php).
источник
^([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})$
должно быть^([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})|(([A-Za-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})$
- заметить разницу ;-)([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})|(([A-Za-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})
(удалить^
и$
добавить?
после пробела) для regexr.com, чтобы найти более одного результата, а для обоих - для результата, который не имеет разделителя пробелов.(?:)
а затем поместить вокруг нее якоря. Увидеть это не удастся здесь . Для получения дополнительной информации см. Мой ответ здесь .^(?:([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})|(([A-Za-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}))$
исправленное регулярное выражение.Старый пост, но все еще довольно высокий в результатах Google, поэтому думал, что я буду обновлять. Этот документ от 14 октября определяет регулярное выражение почтового индекса Великобритании:
из:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf
Документ также объясняет логику этого. Тем не менее, он имеет ошибку (выделено жирным шрифтом), а также позволяет использовать нижний регистр, который, хотя и не является законным, поэтому исправленный вариант:
Это работает с новыми лондонскими почтовыми индексами (например, W1D 5LH), которых не было в предыдущих версиях.
источник
(?:)
а затем поместить вокруг нее якоря. Увидеть это не удастся здесь . Для получения дополнительной информации см. Мой ответ здесь .^(?:([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})|(([A-Za-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}))$
исправленное регулярное выражение.Это регулярное выражение, которое Google обслуживает в своем домене i18napis.appspot.com :
источник
Почтовые индексы могут быть изменены, и единственный верный способ проверить почтовый индекс - это иметь полный список почтовых индексов и посмотреть, есть ли он там.
Но регулярные выражения полезны, потому что они:
Но регулярные выражения, как правило, трудно поддерживать, особенно для тех, кто их не придумал. Так и должно быть:
Это означает, что большинство регулярных выражений в этом ответе недостаточно хороши. Например, я вижу, что
[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
это будет соответствовать области почтового индекса в форме AA1A - но это будет боль в шее, если и когда будет добавлена новая область почтового индекса, потому что трудно понять, какие области почтового индекса она соответствует.Я также хочу, чтобы мое регулярное выражение совпадало с первой и второй половиной почтового индекса в виде скобок.
Итак, я придумал это:
В формате PCRE это можно записать следующим образом:
Для меня это правильный баланс между проверкой в максимально возможной степени, но в то же время перспективой и возможностью легкого обслуживания.
источник
aSW1A 1AAasfg
для меня (например, я не понизил голосование, так как кажется, что это можно легко исправить)В течение последнего дня я искал регулярное выражение для почтового индекса в Великобритании и наткнулся на эту тему. Я работал над большинством приведенных выше предложений, и ни одно из них не сработало для меня, поэтому я пришел к своему собственному регулярному выражению, которое, насколько я знаю, фиксирует все действительные почтовые индексы Великобритании по состоянию на январь 13 года (согласно последней литературе из Королевская Почта).
Регулярное выражение и несколько простых проверок почтового кода PHP-кода размещены ниже. ПРИМЕЧАНИЕ: - Он позволяет использовать нижний или верхний регистр почтовых индексов и аномалию GIR 0AA, но для устранения более или менее вероятного наличия пробела в середине введенного почтового индекса он также использует простое str_replace для удаления пробела перед тестированием. против регулярного выражения Любые расхождения, помимо этого, и в самой «Королевской почте» даже не упоминаются в их литературе (см. Http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf и начните читать со страницы 17). !
Примечание: в собственной литературе Royal Mail (ссылка выше) есть небольшая двусмысленность в отношении 3-й и 4-й позиций и исключений, если эти символы являются буквами. Я связался с Royal Mail напрямую, чтобы выяснить это и своими словами: «Письмо в 4-й позиции Внешнего кода в формате AANA NAA не имеет исключений, а исключения 3-й позиции применяются только к последней букве Исходящего кода с Формат АНА НАА. " Прямо изо рта лошади!
Я надеюсь, что это поможет любому, кто сталкивается с этой темой, ищет решение.
источник
SW1A
илиBD25
без второй половины (или, по крайней мере, для меня)Вот регулярное выражение, основанное на формате, указанном в документах, которые связаны с ответом marcj:
Единственная разница между этим и спецификациями состоит в том, что последние 2 символа не могут быть в [CIKMOV] согласно спецификациям.
Редактировать: вот еще одна версия, которая проверяет наличие ограничений на конечный символ.
источник
A-Z
-Q
никогда не разрешается,V
используется только экономно и т. Д., В зависимости от положения символа.Некоторые из приведенных выше регулярных выражений немного ограничены. Обратите внимание на подлинный почтовый индекс: «W1K 7AA» потерпит неудачу, учитывая правило «Позиция 3 - только AEHMNPRTVXY используется», так как «K» будет запрещено.
регулярное выражение:
Кажется немного более точным, см. Статью в Википедии под названием «Почтовые индексы в Великобритании» .
Обратите внимание, что это регулярное выражение требует только заглавные буквы.
Главный вопрос заключается в том, ограничиваете ли вы ввод данных пользователем только теми существующими почтовыми кодами или просто пытаетесь запретить пользователям вводить полный мусор в поля формы. Правильно подобрать каждый возможный почтовый индекс и проверить его в будущем - сложная головоломка, и, вероятно, она того не стоит, если вы не являетесь HMRC.
источник
вот как мы имеем дело с проблемой почтового индекса в Великобритании:
Объяснение:
Это получает большинство форматов, затем мы используем базу данных, чтобы проверить, является ли почтовый индекс реальным, эти данные определяются открытой точкой https://www.ordnancesurvey.co.uk/opendatadownload/products.html.
надеюсь это поможет
источник
AANNA NAA
, который является недопустимым.Основные правила:
Почтовые коды в Великобритании (или почтовые индексы, как они называются) состоят из пяти-семи буквенно-цифровых символов, разделенных пробелом. Правила, определяющие, какие символы могут появляться на определенных позициях, довольно сложны и чреваты исключениями. Поэтому только что показанное регулярное выражение придерживается основных правил.
Полные правила:
Если вам нужно регулярное выражение, которое помечает все поля для правил почтового индекса за счет читабельности, то вы идете:
Источник: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Проверено на базе данных наших клиентов и выглядит совершенно точно.
источник
Я использую следующее регулярное выражение, которое я проверял по всем действующим британским почтовым индексам. Оно основано на рекомендуемых правилах, но сжато настолько, насколько это разумно, и не использует никаких специальных правил регулярных выражений для конкретного языка.
Предполагается, что почтовый индекс был преобразован в верхний регистр и не имеет начальных или конечных символов, но примет необязательный пробел между исходным кодом и incode.
Специальный почтовый индекс "GIR0 0AA" исключен и не будет подтвержден, поскольку он не входит в официальный список почтовых индексов почтового отделения и, насколько мне известно, не будет использоваться в качестве зарегистрированного адреса. Добавление его должно быть тривиальным, как особый случай, если это необходимо.
источник
Я хотел простое регулярное выражение, где можно допустить слишком много, но не запретить действительный почтовый индекс. Я пошел с этим (вход представляет собой раздетую / обрезанную строку):
Это позволяет использовать как можно более короткие почтовые индексы, например «L1 8JQ», так и самые длинные, например «OL14 5ET».
Поскольку он допускает до 8 символов, он также допускает неправильные 8-символьные почтовые индексы, если нет пробела: «OL145ETX». Но опять же, это упрощенное регулярное выражение, когда этого достаточно.
источник
Первая половина почтового индекса Действительные форматы
Исключения
Позиция 1 - QVX не используется
Позиция 2 - IJZ не используется, за исключением GIR 0AA
Позиция 3 - используется только AEHMNPRTVXY
Позиция 4 - ABEHMNPRVWXY
Вторая половина почтового индекса
Исключения
Позиция 2 + 3 - CIKMOV не используется
Помните, что не все возможные коды используются, поэтому этот список является необходимым, но не достаточным условием для действительного кода. Может быть проще сопоставить список всех действительных кодов?
источник
Чтобы проверить почтовый индекс в допустимом формате в соответствии с руководством программиста Royal Mail :
Все почтовые индексы на doogal.co.uk совпадают, кроме тех, которые больше не используются.
Добавление
?
после пробела и использование нечувствительного к регистру соответствия, чтобы ответить на этот вопрос:источник
Этот позволяет пустые места и табуляцию с обеих сторон, если вы не хотите, чтобы проверка не прошла, а затем обрежьте ее с другой стороны.
источник
AAA 1AA
, неверный формат: см. Мой ответ для объяснения и исправления.Чтобы добавить в этот список более практичное регулярное выражение, которое я использую, которое позволяет пользователю ввести
empty string
:Это регулярное выражение позволяет использовать заглавные и строчные буквы с необязательным пробелом между
С точки зрения разработчиков программного обеспечения это регулярное выражение полезно для программного обеспечения, где адрес может быть необязательным. Например, если пользователь не хочет указывать свой адрес
источник
Посмотрите на код Python на этой странице:
http://www.brunningonline.net/simon/blog/archives/001292.html
Я использовал его для обработки почтовых индексов для меня.
источник
Нам дали спецификацию:
Мы придумали это:
Но обратите внимание - это позволяет любое количество пробелов между группами.
источник
У меня есть регулярное выражение для проверки почтового индекса в Великобритании.
Это работает для всех типов почтовых индексов, внутренних или внешних
Это работает для всех типов форматов.
Пример:
источник
Принятый ответ отражает правила, данные Royal Mail, хотя в регулярном выражении есть опечатка. Похоже, что эта опечатка была и на сайте gov.uk (как и на странице архива XML).
В формате A9A 9AA правила разрешают символ P в третьей позиции, а регулярное выражение запрещает это. Правильное регулярное выражение будет:
Сокращение этого приводит к следующему регулярному выражению (которое использует синтаксис Perl / Ruby):
Он также включает в себя необязательный пробел между первым и вторым блоком.
источник
То, что я нашел почти во всех вариациях и регулярном выражении из pdf для массового переноса, и то, что находится на сайте википедии, таково, особенно для регулярного выражения википедии, должен быть ^ после первого | (вертикальная черта). Я понял это, протестировав AA9A 9AA, потому что в противном случае проверка формата для A9A 9AA проверит его. Например, проверка для EC1D 1BB, который должен быть недействительным, возвращается действительной, поскольку C1D 1BB является допустимым форматом.
Вот что я придумал для хорошего регулярного выражения:
источник
Через эмпирическое тестирование и наблюдение, а также подтверждение с помощью https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , вот моя версия регулярного выражения Python, которое правильно анализирует и проверяет почтовый индекс Великобритании:
UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'
Это регулярное выражение простое и имеет группы захвата. Он не включает в себя все проверки законных почтовых индексов Великобритании, но учитывает только позиции буквы против номера.
Вот как я бы использовал это в коде:
Вот модульные тесты:
источник
Мне нужна была версия, которая работала бы в SAS с
PRXMATCH
соответствующими функциями, поэтому я придумал это:Тестовые случаи и примечания:
источник
Ниже метод проверит почтовый индекс и предоставит полную информацию
источник