Регулярное выражение только для Англии Почтовый индекс

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

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

Из этого списка следующие области почтовых индексов не находятся в Англии.

  • ZE,KW,IV,HS,PH,AB,DD,PA,FK,G,KY,KA,DG,TD,EH,ML (Шотландия)
  • LL,SY,LD,HR,NP,CF,SA (Уэльс)
  • BT (Северная Ирландия)

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

Может ли кто-нибудь помочь мне создать регулярное выражение, которое будет соответствовать, только если заданный почтовый индекс английский?

ИЗМЕНИТЬ — Решение

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

^(AL|B|B[ABDHLNRS]|C[ABHMORTVW]|D[AEHLNTY]|E|E[CNX]|FY|G[LUY]|H[ADGPUX]|I[GM‌​P]‌​ |JE |KT|L|L[AENSU]|M|ME|N|N[EGNRW]|O[LX]|P[ELOR]|R[GHM]|S|S[EGKLMNOPRSTW]|T[AFNQ‌​‌​ RSW ]|UB|W|W[ACDFNRSV]|YO)\d{1,2}\s?(\d[\w]{2})?


person Robbie    schedule 07.03.2012    source источник
comment
Также сколько кодов существует для Шотландии, Уэльса и Северной Ирландии? Потому что может быть легче сопоставить отрицательные значения, чем положительные, в зависимости от чисел.   -  person Hersha    schedule 08.03.2012
comment
@Hersha Да, я планировал сделать негативы   -  person Robbie    schedule 08.03.2012
comment
МК, Милтон-Кейнс отсутствует в вашем регулярном выражении en.wikipedia.org/wiki/. FYI для других людей GY для Гернси, JE для Джерси и IM для острова Мэн включены в регулярное выражение. Это может быть хорошо, но если вы находитесь только на материковой части Англии, вам придется удалить эти зависимости от Crown.   -  person Neil    schedule 24.09.2013


Ответы (6)


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

-- Статистика PAF®, август 2012 г., через Список почтовых индексов в Соединенном Королевстве (Википедия).

Я рекомендую разбить вашу проблему на две части (например, функции):

  1. Почтовый индекс действителен?

    Регулярное выражение почтового индекса Великобритании (полное)

  2. Почтовый индекс английский?

    Это можно разбить дальше:

    • Not Scottish:
      • ! /^(ZE|KW|IV|HS|PH|AB|DD|PA|FK|G|KY|KA|DG|TD|EH|ML)[0-9]/
    • Not Welsh:
      • ! /^(LL|SY|LD|HR|NP|CF|SA)[0-9]/
    • Not Northern Irish, Manx, from the Channel Islands, ...
      • et cetera...
    • или вы можете просто проверить, что область почтового индекса входит в число сотен или около того английских, в зависимости от того, как вы хотите оптимизировать ☻

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

person Johnsyweb    schedule 07.03.2012
comment
Когда я впервые увидел это, я подумал, что это неправильно, но потом (я думаю) вы отредактировали его и добавили [0-9] в конце, и это все изменило. Это устраняет проблему сопоставления символов из оставшегося ввода. Ваш четвертый пункт об использовании только английских почтовых индексов, вероятно, является правильным (хотя изначально я думал об обратном). Это немного более длинное регулярное выражение, но оно избавляет меня от необходимости беспокоиться о других случайных местах, таких как Гибралтар, Нормандские острова и т. д., так что это ваша заслуга :) - person Robbie; 08.03.2012
comment
я думаю, что это работает ^(AL|B|B[ABDHLNRS]|C[ABHMORTVW]|D[AEHLNTY]|E|E[CNX]|FY|G[LUY]|H[ADGPUX]|I[GM‌​P] |JE|KT|L|L[AENSU]|M|ME|N|N[EGNRW]|O[LX]|P[ELOR]|R[GHM]|S|S[EGKLMNOPRSTW]|T[AFNQ‌​RSW ]|UB|W|W[ACDFNRSV]|YO)\d{1,2}\s?(\d[\w]{2})? - person Robbie; 11.03.2012
comment
Ссылка на кабинет не работает. - person Neil; 17.09.2013
comment
@Neil: я заменил мертвую ссылку. Не стесняйтесь редактировать ответы, если обнаружите мертвые ссылки. - person Johnsyweb; 18.09.2013

Я уже ответил однажды, подчеркнув, что невозможно придумать 100% правильное регулярное выражение только для Англии (поскольку области почтовых индексов не лежат вдоль политических границ).

Однако я немного углубился в это, и... ну, это возможно возможно, но это большая работа.

Чтобы проверить почтовый индекс только для Англии, необходимо исключить неанглийские почтовые индексы. Легкие:

  • BT (Северная Ирландия)
  • IM (Остров Мэн)
  • JE (Джерси)
  • GG (Гернси)
  • BF (британские вооруженные силы)
  • BX (негеографические почтовые индексы Великобритании)
  • GIR (Гиробанк, который также не является географическим)

(Я не буду упоминать почтовые индексы в британском стиле для территорий за пределами Великобритании, таких как остров Святой Елены, Гибралтар и т. д. С технической точки зрения остров Мэн и Нормандские острова также не являются частью Великобритании, но они намного ближе компанией и более тесно связана с системой Королевской почты в Великобритании.)

Чисто шотландские области почтового индекса (как вы упомянули):

ZE,KW,IV,HS,PH,AB,DD,PA,FK,G,KY,KA,EH,ML

DG и TD номинально являются шотландцами и по большей части находятся в Шотландии. Однако некоторые районы простираются за границу Шотландии и Англии следующим образом:

  • DG16 — немного в Англии
  • TD9 — немного в Англии
  • TD12 — половина в Англии
  • TD15 — в основном в Англии

Разбивка выглядит следующим образом:

DG16 находится в Шотландии, за исключением следующих английских почтовых индексов:

  • DG16 5H[ТУЗ]
  • DG16 5J[AB]

TD9 находится в Шотландии, за исключением TD9 0T[JPRSTUW].

TD12 имеет только один сектор (TD12 4), который примерно наполовину распределен по Англии и Шотландии:

  • TD12 4[ABDEHJLN] находятся в Шотландии.
  • TD12 4[QRSTUWX] находятся в Англии.

TD15 — самый сложный. Есть 3 сектора, из которых TD15 2 и TD15 9 полностью находятся в Англии.

TD15 1 разделен на Англию и Шотландию.

Почтовые индексы, начинающиеся следующим образом, находятся в Шотландии:

  • TD15 1T
  • TD15 1X

... за исключением этих английских почтовых индексов:

  • TD15 1T[ABQUX]
  • TD15 1XX

Все остальные почтовые индексы в TD15 1 указаны в Англии, за исключением тех, которые начинаются следующим образом:

  • TD15 1B
  • TD15 1S (например, TD15 1S[ABEJLNPWXY])
  • TD15 1U (например, TD15 1U[BDENPQRTUXY])

... все они находятся в Англии, за исключением следующих почтовых индексов, которые находятся в Шотландии:

  • TD15 1BT
  • TD15 1S[УЗ]
  • TD15 1U[FGHJLSZ]

Английские почтовые индексы CA и NE лежат по другую сторону англо-шотландской границы, однако они никогда не выходят на территорию Шотландии.

Фактически, последние две буквы почтового индекса Великобритании основаны на том, как почтальон на самом деле доставляет почту (насколько мне известно), поэтому не считается само собой разумеющимся, что она попадет в политические границы. Таким образом, если есть группа домов, расположенных по обе стороны границы, то вполне возможно, что весь почтовый индекс (т.е. на самом детальном уровне) не находится полностью ни в Англии, ни в Шотландии. Например. TD9 0TJ и TD15 1UZ находятся очень близко к границе, и я точно не знаю, находятся ли они полностью на одной стороне или нет.

Граница между Англией и Уэльсом также сложна, однако я оставлю это в качестве упражнения для читателя.

person jim    schedule 02.08.2013
comment
Привет, Джим. Прошло почти 4 года, и я нашел это действительно полезным. Большое спасибо за ваше время и усилия здесь. Быстрый вопрос - есть ли опечатка в этой части: TD12 4[ABDEHJLN] are in Scotland | TD12 4[QRSTUWX] are in England? - person michaelmcgurk; 27.04.2017

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

Например, CH1 находится в Англии, а CH5 — в Уэльсе.

На уровне почтовых индексов все еще есть проблемы, например TD12 наполовину в Англии, наполовину в Шотландии.

Единственная область, на которую вы можете положиться, — это BT (Северная Ирландия).

person jim    schedule 30.11.2012
comment
Вы правы в том, что невозможно быть на 100% правильным из-за границ, но решение, которое я разместил в редактировании вопроса, было достаточно точным для нужд моих клиентов. - person Robbie; 30.11.2012

Используйте ^(AB|AL|B| ... )$, где ... - это место, где вы заполняете остальные допустимые, разделенные вертикальной чертой (|).

EDIT: здесь много информации: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

Если бы вы включили коды входа/выхода, это было бы что-то вроде ^(AB|AL|B| ... )([\d\w]{3})\s([\d\w]{3})$, которое получило бы остальную часть кода.

ИЗМЕНИТЬ

^(A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CNX]?|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|T[AFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE)([\w\d]{1,2})\s?([\w\d]{3})$

Часть этого регулярного выражения взята из другого ответа. Он соответствует действительным почтовым индексам, затем от 1 до 2 {1,2} букв \w или цифр \d, необязательный пробел \s?, затем 3 буквы или цифры. Надеюсь, это поможет.

person Derreck Dean    schedule 07.03.2012
comment
Да, это то, о чем я думал изначально, но не будет ли это неправильно исключать действительные почтовые индексы, которые содержат эти символы в других местах. Например, G — это Глазго, но есть допустимые английские почтовые индексы, содержащие букву G, например GL. - person Robbie; 08.03.2012
comment
Вот для чего нужны ^ и $ — они заставляют соответствовать всей строке, а не только ее части. - person Derreck Dean; 08.03.2012
comment
Я попытался перевернуть это и ввести действительные английские почтовые индексы. Я удалил ^, так как хочу, чтобы он соответствовал им, и попробовал это с несколькими образцами. Это выглядело так (AL|B|BA|... остальные допустимые коды)$ Похоже, это не сработало. Например, HG2 8EH не совпадает, но должен - я неправильно понял, как это сделать? - person Robbie; 09.03.2012
comment
Мне очень нравится это решение, потому что оно проверяет как правильность структуры почтового индекса, так и его англоязычность. Единственная проблема (для меня) заключается в том, что он требует ввода всего почтового индекса (и не обрабатывает только ввод области почтового индекса). Я ценю, что это может быть полезно для других, которым нужна полная проверка почтового индекса, и поэтому я проголосовал за это. - person Robbie; 10.03.2012
comment
Я прокомментировал принятый ответ, показав, как я изменил ваше предложение, чтобы оно работало с частичными и полными почтовыми индексами и с белым списком вместо черного списка. - person Robbie; 10.03.2012

Это RegEx, который я собрал, который соответствует стандартам, определенным Royal Mail для всех типов почтовых индексов Великобритании:

Стандартные почтовые индексы Великобритании:

/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i

Почтовые индексы GiroBank:

/^(GIR)\s*(0AA)$/i

Заморские территории Великобритании:

/^([A-Z]{4})\s*(1ZZ)$/i

Почтовое отделение британских вооруженных сил:

/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i

И это функция, которую я написал, которая проверяет почтовый индекс на соответствие этим четырем типам и позволяет определять тип:

public function UKPostCode(&$strPostCode, &$strError = null, &$strType = null, $ReturnFormatted = true) {
    $strStrippedPostCode = preg_replace("/[\s\-]/i", "", $strPostCode);

    if (empty($strStrippedPostCode)) {
        $strError = $this->__getErrorMessage("Post", "EMPTY_POST");
        return false;

    }

    $arrRegExp = array(
        "STD" => "/^([A-PR-UWYZ](?:[0-9]{1,2}|[0-9][A-HJKMNPR-Y]|[A-HK-Y][0-9]{1,2}|[A-HK-Y][0-9][ABEHMNPRVWXY]))\s*([0-9][ABD-HJLNP-UW-Z]{2})$/i",
        "GIR" => "/^(GIR)\s*(0AA)$/i",
        "OST" => "/^([A-Z]{4})\s*(1ZZ)$/i",
        "BFPO" => "/^(BFPO)\s*(?:(c\/o)\s*)?((?(2)[0-9]{1,3}|[0-9]{1,4}))$/i"
    );

    foreach ($arrRegExp as $strPostCodeType => $strExpression) {

        if (preg_match($strExpression, $strPostCode, $arrMatches)) {

            if ($ReturnFormatted !== null) {
                array_shift($arrMatches);
                $strPostCode = implode(" ", array_filter($arrMatches));
                $strPostCode = ((bool)$ReturnFormatted === true) ? strtoupper($strPostCode) : strtolower($strPostCode);

            }

            $strType = $strPostCodeType;
            return true;

        }

    }

    $strError = $this->__getErrorMessage("Post", "INVALID_POST");
    return false;

}

Надеюсь это поможет

person Seth    schedule 17.07.2013
comment
Здесь нет ничего, что отвечало бы на фактический вопрос об Англии, только почтовые индексы, но полезно как ресурс, так что спасибо за участие. Я дам вам ваши первые 10 баллов - добро пожаловать в ТАК :) - person Robbie; 19.07.2013

person    schedule
comment
Я пробовал это регулярное выражение, и оно возвращает совпадения для довольно многих неанглийских почтовых индексов... например, G11 5EH (Глазго - его соответствие на «E»). Все, что содержит любой из однобуквенных исходных кодов в инкоде, соответствует этому регулярному выражению.... это та же проблема, о которой я упоминал в ответе Деррека Дина. - person Robbie; 08.03.2012