Регулярное выражение только для Англии Почтовый индекс - PullRequest
5 голосов
/ 08 марта 2012

У меня есть веб-сайт 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] | С [ABHMORTVW] | D [AEHLNTY] | Е | Е [CNX] | ФГ | G [Luy] | Н [ADGPUX] | I [GM P] | JE | КТ | L | L [AENSU] | М | М | N | N [EGNRW] | O [LX] | Р [ELOR] | Р [ГХМЫ] | S | S [EGKLMNOPRSTW] | Т [AFNQ RSW] | UB | W | W [ACDFNRSV] |? YO) \ д {1,2} \ с (\ d [\ ш] {2})

Ответы [ 6 ]

8 голосов
/ 03 августа 2013

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

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

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

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

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

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

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

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

  • DG16 - чуть-чуть в Англии
  • TD9 - чуть-чуть в Англии
  • TD12 - половина в Англии
  • TD15 - в основном в Англии

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

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

  • DG16 5H [TUZ]
  • 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 [UZ]
  • TD15 1U [FGHJLSZ]

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

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

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

4 голосов
/ 08 марта 2012

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

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

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

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

    Почтовый индекс Великобритании (полное)

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

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

    • Не шотландский:
      • ! /^(ZE|KW|IV|HS|PH|AB|DD|PA|FK|G|KY|KA|DG|TD|EH|ML)[0-9]/
    • Не валлийский:
      • ! /^(LL|SY|LD|HR|NP|CF|SA)[0-9]/
    • Не северный ирландец, мэнкс, с Нормандских островов, ...
      • и так далее ...
    • или вы можете просто проверить, что область почтовых индексов входит в сотню или около того английских, в зависимости от того, как вы хотите оптимизировать ☻

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

3 голосов
/ 30 ноября 2012

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

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

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

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

1 голос
/ 17 июля 2013

Это 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;

}

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

1 голос
/ 08 марта 2012

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

РЕДАКТИРОВАТЬ: Здесь есть куча информации здесь: http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

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

EDIT

^(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 буквы или цифры. Надеюсь, это поможет.

0 голосов
/ 08 марта 2012
'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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...