Регулярные выражения внутри Угловые валидаторы [дубликаты]

Js - однопоточная.

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

139
задан g . 20 July 2015 в 12:03
поделиться

28 ответов

Я бы рекомендовал взглянуть на стандарт данных правительства Великобритании для почтовых индексов [ссылка сейчас мертва; архив XML , см. Wikipedia для обсуждения]. Существует краткое описание данных, и прилагаемая xml-схема обеспечивает регулярное выражение. Это может быть не совсем то, что вы хотите, но будет хорошей отправной точкой. RegEx отличается от XML немного, так как значение P в третьей позиции в формате A9A 9AA разрешено данным определением.

RegEx, предоставленный правительством Великобритании, был:

([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]?))))\s?[0-9][A-Za-z]{2})

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

158
ответ дан 10 revs, 9 users 29% 24 August 2018 в 09:35
поделиться

Это регулярное выражение Google служит в домене i18napis.appspot.com :

GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}
8
ответ дан Alix Axel 24 August 2018 в 09:35
поделиться

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

Но регулярные выражения полезны, потому что они:

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

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

  • как можно проще понять
  • относительно будущего доказательства

Это означает, что большинство регулярных выражений в этом ответе недостаточно. Например. Я вижу, что [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] будет соответствовать области почтового индекса формы AA1A - но это будет боль в области шеи, если и когда добавится новая область почтового индекса, потому что трудно понять, в каких областях почтового индекса это соответствует.

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

Итак, я придумал следующее:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

В формате PCRE его можно записать следующим образом:

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

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

10
ответ дан andre 24 August 2018 в 09:35
поделиться

То, что я нашел почти во всех вариациях и регулярном выражении из объемной передачи pdf, и что находится на сайте wikipedia, это, в частности, для regex wikipedia, должно быть a ^ после первого | (вертикальная полоса) , Я понял это, тестируя AA9A 9AA, потому что в противном случае проверка формата для A9A 9AA будет проверять его. Для примера проверка EC1D 1BB, которая должна быть недействительной, возвращается, так как C1D 1BB является допустимым форматом.

Вот что я нашел для хорошего регулярного выражения:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$
1
ответ дан Andrew Schliewe 24 August 2018 в 09:35
поделиться

Согласно этой таблице Википедии

enter image description here [/g0]

Этот шаблон охватывает все случаи

(?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2})

При использовании его на Android \ Java использовать \\ d

11
ответ дан AntPachon 24 August 2018 в 09:35
поделиться

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

([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})

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

Специальный почтовый индекс GIR0 0AA исключается и не будет проверяться, поскольку он не находится в официальном списке почтовых индексов почтовых индексов и в качестве насколько я знаю, он не будет использоваться в качестве зарегистрированного адреса. Если это необходимо, добавление должно быть тривиальным, если это необходимо.

3
ответ дан Chisel 24 August 2018 в 09:35
поделиться

Я рассмотрел некоторые из приведенных выше ответов, и я бы рекомендовал не использовать шаблон из ответа @ Dan (c. Dec 15 '10) , так как он неправильно помещает почти 0,4% действительные почтовые индексы недействительны, а другие - нет.

Обследование обрядов предоставляет сервис под названием Code Point Open, который:

содержит список всех существующих единиц почтового индекса в Великобритании

Я выполнил каждое из приведенных выше выражений против полного списка почтовых индексов (июль 6 '13) из этих данных, используя grep:

cat CSV/*.csv |
    # Strip leading quotes
    sed -e 's/^"//g' |
    # Strip trailing quote and everything after it
    sed -e 's/".*//g' |
    # Strip any spaces
    sed -E -e 's/ +//g' |
    # Find any lines that do not match the expression
    grep --invert-match --perl-regexp "$pattern"

Всего было 1 626 202 почтовых индексов.

Ниже приведены числа действительных почтовых индексов, которые не соответствуют каждому $pattern:

'^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$'
# => 6016 (0.36%)
'^(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})$'
# => 0
'^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}$'
# => 0

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

'^.*$'
# => 0

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

20
ответ дан Community 24 August 2018 в 09:35
поделиться
1
ответ дан ctwheels 24 August 2018 в 09:35
поделиться
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$

Регулярное выражение для соответствия действующим британским почтовым индексам. В почтовой системе Великобритании не все буквы используются во всех позициях (то же самое с регистрационными табличками транспортных средств), и существуют различные правила, регулирующие это. Это регулярное выражение учитывает эти правила. Подробная информация о правилах: первая половина почтового индекса. Действующие форматы [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [AZ] [0-9] [AZ] [AZ] [0-9] Исключения Позиция - первая. Contraint - QVX не используется. Позиция - вторая. Contraint - IJZ не используется, за исключением позиции GIR 0AA - в-третьих. Constraint - AEHMNPRTVXY использовал только позицию - Forth. Contraint - ABEHMNPRVWXY Вторая половина почтового индекса Действительные форматы [0-9] [A-Z] [A-Z] Позиция Исключения - вторая и третья. Contraint - CIKMOV не используется

http://regexlib.com/REDetails.aspx?regexp_id=260

16
ответ дан Dan 24 August 2018 в 09:35
поделиться

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

Регулярное выражение и некоторый простой код для проверки почтового кода 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 не имеет исключений, а исключения третьей позиции относятся только к последней букве Внешнего кода с формат ANA NAA ".

<?php

    $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i';

    $postcode2check = str_replace(' ','',$postcode2check);

    if (preg_match($postcoderegex, $postcode2check)) {

        echo "$postcode2check is a valid postcode<br>";

    } else {

        echo "$postcode2check is not a valid postcode<br>";

    }

?>

Я надеюсь, что это поможет кому-то еще, кто встречает эту тему, ищет решение.

9
ответ дан Dan Solo 24 August 2018 в 09:35
поделиться

Некоторые из приведенных выше выражений немного ограничены. Обратите внимание на подлинный почтовый индекс: «W1K 7AA» потерпит неудачу с учетом правила «Позиция 3 - только AEHMNPRTVXY» выше, поскольку «K» будет запрещен.

регулярное выражение:

^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$

Кажется немного более точным, см. Статью Wikipedia, озаглавленную «Почтовые индексы в Соединенном Королевстве» .

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

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

6
ответ дан DMK 24 August 2018 в 09:35
поделиться

Мне нужно простое регулярное выражение, где хорошо разрешить слишком много, но не отрицать действительный почтовый индекс. Я пошел с этим (входной файл был обрезанной / обрезанной):

/^([a-z0-9]\s*){5,7}$/i

Длина от 5 до 7 (без учета пробелов) означает, что мы разрешаем кратчайшие почтовые индексы типа " L1 8JQ ", а также самые длинные, такие как" OL14 5ET ".

EDIT: Изменено 8 до 7, поэтому мы не допускаем почтовых индексов 8 символов.

2
ответ дан Henrik N 24 August 2018 в 09:35
поделиться

Проверить почтовый индекс в допустимом формате в соответствии с руководством программиста Королевской почты :

          |----------------------------outward code------------------------------| |------inward code-----|
#special↓       α1        α2    AAN  AANA      AANN      AN    ANN    ANA (α3)        N         AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

Все почтовые индексы на doogal.co.uk , за исключением тех, которые больше не используются.

Добавление ? после пробела и использование нечувствительного к регистру совпадения для ответа на этот вопрос:

'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]
3
ответ дан Jackson Pauls 24 August 2018 в 09:35
поделиться

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

http://www.ukpostcode.net/wiki/develop

1
ответ дан James Duan 24 August 2018 в 09:35
поделиться

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

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/ 413338 / Bulk_Data_Transfer _-_ дополнительная_validation_valid_from_March_2015.pdf

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

^([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})$

UPDATE: обновлено регулярное выражение, указанное Джеми Буллом. Не уверен, что это было мое копирование ошибок, или это была ошибка в правительственном регулярном выражении, ссылка теперь недоступна ...

UPDATE: Как обнаружено ctwheels, это регулярное выражение работает с ароматом regex javascript. См. Его комментарий к тому, который работает с вкусом pcre (php).

12
ответ дан Jesús Carrera 24 August 2018 в 09:35
поделиться

Первая половина почтового индекса. Действующие форматы

  • [AZ] [AZ] [0-9] [AZ]
  • [AZ] [AZ] [0-9 ] [0-9]
  • [AZ] [0-9] [0-9]
  • [AZ] [AZ] [0-9]
  • [AZ] [AZ] [AZ]
  • [AZ] [0-9] [AZ]
  • [AZ] [0-9]

Исключения Позиция 1 - QVX не используется Позиция 2 - IJZ не используется, кроме GIR 0AA Позиция 3 - используется только AEHMNPRTVXY Позиция 4 - ABEHMNPRVWXY

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

  • [0-9] [AZ] [AZ]

Исключения Позиция 2 + 3 - CIKMOV не используется

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

3
ответ дан Martin Beckett 24 August 2018 в 09:35
поделиться

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

^\s*(([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,1}[0-9][A-Za-z]{2})\s*$)
3
ответ дан Matas Vaitkevicius 24 August 2018 в 09:35
поделиться

Нам дана спецификация:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

Мы пришли к следующему:

/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i

Но заметьте - это позволяет любое количество пробелов между группами.

1
ответ дан paulslater19 24 August 2018 в 09:35
поделиться

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

Это работает для любого типа почтового индекса, который является внутренним или внешним

^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$

. Он работает для всех типов форматов.

Пример:

AB10 --------------------> ТОЛЬКО НАЧАЛЬНЫЙ POSTCODE

A1 1AA ------------------> КОМБИНАЦИЯ (ВНЕШНИЙ И ВНУТРЕННИЙ) POSTCODE

WC2A ------------ --------> OUTER

1
ответ дан Peter O. 24 August 2018 в 09:35
поделиться

Основные правила:

^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$

Почтовые коды в U.K. (или почтовые индексы, как их называют) состоят из пяти-семи буквенно-цифровых символов, разделенных пробелом. Правила, охватывающие символы, которые могут появляться на определенных позициях, довольно сложны и чреваты исключениями. Таким образом, регулярное выражение просто указывает на основные правила.

Полные правила:

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

^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$

Источник: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

Протестировано в отношении базы данных наших клиентов и кажется совершенно точным.

4
ответ дан Raphos 24 August 2018 в 09:35
поделиться

Посмотрите код python на этой странице:

http://www.brunningonline.net/simon/blog/archives/001292.html

У меня есть синтаксический анализ почтового индекса. Требование довольно простое; Я должен разбирать почтовый индекс в outcode и (необязательно). Хорошим новым является то, что мне не нужно выполнять какую-либо проверку - мне просто нужно нарезать то, что мне предоставили смутно разумным образом. Я не могу много думать о моем импорте с точки зрения форматирования, то есть случая и встроенных пространств. Но это не плохая новость; плохая новость заключается в том, что я должен делать все это в RPG. : - (

Тем не менее, я бросил небольшую функцию Python вместе, чтобы прояснить мое мышление.

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

1
ответ дан Rudiger Wolf 24 August 2018 в 09:35
поделиться

Принятый ответ отражает правила, данные Royal Mail, хотя в регулярном выражении есть опечатка. Эта опечатка, похоже, была там и на сайте gov.uk (как на странице архива XML).

В формате A9A 9AA правила допускают символ P в третьей позиции, в то время как регулярное выражение запрещает это. Правильное регулярное выражение будет выглядеть следующим образом:

(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-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

Сокращение этого результата приводит к следующему регулярному выражению (которое использует синтаксис Perl / Ruby):

(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2})

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

1
ответ дан Stieb 24 August 2018 в 09:35
поделиться

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

Почтовые индексы сколь угодно сложны и постоянно меняются. Например, outcode W1 не имеет и может никогда не иметь каждого номера от 1 до 99 для каждой области почтового индекса.

Вы не можете ожидать, что в настоящее время существует истина навсегда. Например, в 1990 году почтовое отделение решило, что Абердин становится немного переполненным. Они добавили 0 к концу AB1-5, сделав его AB10-50, а затем создали несколько почтовых индексов между ними.

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

Кроме того, как отмечает ряд других пользователей, существуют специальные почтовые индексы, такие как Girobank, GIR 0AA и один для писем в Санта, SAN TA1 - вы, вероятно, не хотите ничего размещать там, но на него, похоже, не распространяется какой-либо другой ответ.

Затем есть почтовые индексы BFPO, которые теперь переходит в более стандартный формат . Оба формата будут действительны. Наконец, есть зарубежные территории источник Wikipedia .

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| ASCN 1ZZ | Ascension Island                             |
| STHL 1ZZ | Saint Helena                                 |
| TDCU 1ZZ | Tristan da Cunha                             |
| BBND 1ZZ | British Indian Ocean Territory               |
| BIQQ 1ZZ | British Antarctic Territory                  |
| FIQQ 1ZZ | Falkland Islands                             |
| GX11 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

Затем вам нужно учитывать, что Великобритания «экспортировала» свою систему почтовых индексов во многие места мира. Все, что проверяет почтовый индекс «UK», также подтвердят почтовые индексы ряда других стран.

Если вы хотите проверить почтовый индекс в Великобритании, самый безопасный способ сделать это используйте поиск текущих почтовых индексов. Существует ряд опций:

  • Обзоры выпусков оружия Кодовая точка Open по открытой лицензии на данные. Это будет очень немного позади, но это бесплатно. Это (вероятно, я не могу вспомнить) не включать в себя данные Северной Ирландии, так как обследование боеприпасов там не существует. Картирование в Северной Ирландии проводится Обсервационным Обзором Северной Ирландии, и у них есть свой, отдельный, платный продукт Pointer . Вы можете использовать это и добавить несколько, которые не покрываются довольно легко.
  • Royal Mail выпускает файл адреса почтового индекса (PAF) , в том числе BFPO, который я не уверен Открывается Code-Point Open. Он регулярно обновляется, но стоит денег (и они иногда могут быть в этом похожи). PAF включает полный адрес, а не только почтовый индекс и поставляется со своим Руководством для программистов . Открытая группа пользователей данных (ODUG) в настоящее время лоббирует освобождение PAF бесплатно , здесь описано их положение .
  • Наконец, есть AddressBase , Это сотрудничество между Ordnance Survey, местными властями, Royal Mail и соответствующей компанией, чтобы создать окончательный каталог всей информации обо всех адресах Великобритании (они были довольно успешными, а также). Он оплачивается, но если вы работаете с местным органом, государственным департаментом или государственной службой, это бесплатно для них. Здесь гораздо больше информации, чем только вставляемые почтовые индексы.
38
ответ дан Tony 24 August 2018 в 09:35
поделиться

Похоже, мы собираемся использовать ^(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 Schema , которая предоставляет утверждение «псевдорежима» правил почтового индекса.

Мы взяли это и немного поработали над этим следующее выражение:

^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$

Это делает пространство необязательным, но ограничивает вас одним пространством (замените '& amp;' на '{0,} для неограниченных пробелов). Предполагается, что весь текст должен быть в верхнем регистре.

Если вы хотите разрешить строчный регистр с любым количеством пробелов, используйте:

^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[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}))$

Это не распространяется на заморские территории и только обеспечивает формат, а не существование разных областей. Он основан на следующих правилах:

Может принимать следующие форматы:

  • «GIR 0AA»
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

Где:

  • 9 может быть любым однозначным номером.
  • A может быть любой буквой, кроме Q, V или X.
  • B может быть любая буква, кроме I, J или Z.
  • C может быть любой буквой, за исключением I, L, M, N, O, P, Q, R, V, X, Y или Z.
  • D может быть любой буквой, за исключением I, J или Z.
  • E может быть любым из A, B, E, H, M, N, P, R, V, W, X или Y.
  • Z может быть любой буквой, за исключением C, I, K, M, O или V.

С наилучшими пожеланиями

Колин

78
ответ дан Umber Ferrule 24 August 2018 в 09:35
поделиться

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

^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[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,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$

Это регулярное выражение позволяет писать заглавные и строчные буквы с дополнительным пространством в между

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

2
ответ дан user1 24 August 2018 в 09:35
поделиться

Мне нужна версия, которая будет работать в SAS с PRXMATCH и связанными функциями, поэтому я придумал следующее:

^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$

Тестовые примеры и примечания:

/* 
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/

/*
    Bits and pieces
    1st position (any):         [A-PR-UWYZ]         
    2nd position (if letter):   [A-HK-Y]
    3rd position (A1A format):  [A-HJKPSTUW]
    4th position (AA1A format): [ABEHMNPRV-Y]
    Last 2 positions:           [ABD-HJLNP-UW-Z]    
*/


data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode));
cards;
1  EC1A 1BB  Special case 1
1  W1A 0AX   Special case 2
1  M1 1AE    Standard format
1  B33 8TH   Standard format
1  CR2 6XH   Standard format
1  DN55 1PT  Standard format
0  QN55 1PT  Bad letter in 1st position
0  DI55 1PT  Bad letter in 2nd position
0  W1Z 0AX   Bad letter in 3rd position
0  EC1Z 1BB  Bad letter in 4th position
0  DN55 1CT  Bad letter in 2nd group
0  A11A 1AA  Invalid digits in 1st group
0  AA11A 1AA  1st group too long
0  AA11 1AAA  2nd group too long
0  AA11 1AAA  2nd group too long
0  AAA 1AA   No digit in 1st group
0  AA 1AA    No digit in 1st group
0  A 1AA     No digit in 1st group
0  1A 1AA    Missing letter in 1st group
0  1 1AA     Missing letter in 1st group
0  11 1AA    Missing letter in 1st group
0  AA1 1A    Missing letter in 2nd group
0  AA1 1     Missing letter in 2nd group
;
run;
0
ответ дан user667489 24 August 2018 в 09:35
поделиться

Старая почта, но все еще довольно высокая в результатах Google, поэтому я решил обновить ее. Этот документ Oct 14 определяет регулярное выражение посткода в Великобритании как:

^([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})|(([**AZ**a-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})$

из:

https://www.gov.uk/government/uploads/system/ uploads / attachment_data / file / 359448 / 4__Bulk_Data_Transfer _-_ дополнительная_validation_valid.pdf

Документ также объясняет логику, лежащую в его основе. Тем не менее, он имеет ошибку (полужирный шрифт), а также позволяет использовать нижний регистр, который хотя и не является обычным, так исправленная версия:

^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$

Это работает с новыми лондонскими почтовыми индексами (например, W1D 5LH) не сделал.

12
ответ дан Vivek Jain 24 August 2018 в 09:35
поделиться

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

^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$

Объяснение:

  • ожидает 1 или 2 символа az, верхний или нижний штраф
  • ожидать 1 или 2 числа
  • ожидать 0 или 1 az char, верхний или нижний штраф
  • дополнительное пространство разрешено
  • ожидать 1 номер
  • ожидать 2 az, верхний или нижний штраф

Это получает большинство форматов, затем мы используем db для проверки подлинности почтового индекса, эти данные управляются с помощью openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

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

2
ответ дан ʰᵈˑ 24 August 2018 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: