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
Я бы рекомендовал взглянуть на стандарт данных правительства Великобритании для почтовых индексов [ссылка сейчас мертва; архив 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), и они предоставляют более строгий тест, который вы могли бы попробовать.
Это регулярное выражение 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}
Почтовые индексы могут быть изменены, и единственным истинным способом проверки почтового индекса является полный список почтовых индексов и посмотреть, существует ли он.
Но регулярные выражения полезны, потому что они:
Но регулярные выражения, как правило, трудно поддерживать, особенно для тех, кто не придумал его в первое место. Таким образом, это должно быть:
Это означает, что большинство регулярных выражений в этом ответе недостаточно. Например. Я вижу, что [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
Для меня это правильный баланс между валидацией, насколько это возможно, и в то же время будущая проверка и удобство обслуживания .
То, что я нашел почти во всех вариациях и регулярном выражении из объемной передачи 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})$
Согласно этой таблице Википедии
[/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
Я использую следующее регулярное выражение, которое я проверил против всех допустимых почтовых индексов Великобритании.
([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 исключается и не будет проверяться, поскольку он не находится в официальном списке почтовых индексов почтовых индексов и в качестве насколько я знаю, он не будет использоваться в качестве зарегистрированного адреса. Если это необходимо, добавление должно быть тривиальным, если это необходимо.
Я рассмотрел некоторые из приведенных выше ответов, и я бы рекомендовал не использовать шаблон из ответа @ Dan (c. Dec 15 '10) , так как он неправильно помещает почти 0,4% действительные почтовые индексы недействительны, а другие - нет.
Обследование обрядов предоставляет сервис под названием Code Point Open, который:
содержит список всех существующих единиц почтового индекса в Великобритании
blockquote>Я выполнил каждое из приведенных выше выражений против полного списка почтовых индексов (июль 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
Я ничего не говорю о том, какой шаблон лучше всего подходит для фильтрации недопустимых почтовых индексов.
^([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 не используется
blockquote>
Я искал регулярное выражение для почтового индекса в Великобритании в течение последнего дня или около того и наткнулся на эту тему. Я проделал свой путь в большинстве вышеперечисленных предложений, и никто из них не работал для меня, поэтому я придумал свое собственное регулярное выражение, которое, насколько я знаю, фиксирует все действующие почтовые индексы Великобритании по состоянию на 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>";
}
?>
Я надеюсь, что это поможет кому-то еще, кто встречает эту тему, ищет решение.
Некоторые из приведенных выше выражений немного ограничены. Обратите внимание на подлинный почтовый индекс: «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.
Мне нужно простое регулярное выражение, где хорошо разрешить слишком много, но не отрицать действительный почтовый индекс. Я пошел с этим (входной файл был обрезанной / обрезанной):
/^([a-z0-9]\s*){5,7}$/i
Длина от 5 до 7 (без учета пробелов) означает, что мы разрешаем кратчайшие почтовые индексы типа " L1 8JQ ", а также самые длинные, такие как" OL14 5ET ".
EDIT: Изменено 8 до 7, поэтому мы не допускаем почтовых индексов 8 символов.
Проверить почтовый индекс в допустимом формате в соответствии с руководством программиста Королевской почты :
|----------------------------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" ]
здесь вы можете найти несколько полезных ссылок, зависит от того, какой язык вы используете:
Большинство ответов здесь не работали для всех почтовых индексов, которые у меня есть в моей базе данных. Я, наконец, нашел тот, который проверяет все, используя новое регулярное выражение, предоставленное правительством:
Это ни в одном из предыдущих ответов, поэтому я размещаю его здесь, если они берут ссылку вниз:
^([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).
Первая половина почтового индекса. Действующие форматы
Исключения Позиция 1 - QVX не используется Позиция 2 - IJZ не используется, кроме GIR 0AA Позиция 3 - используется только AEHMNPRTVXY Позиция 4 - ABEHMNPRVWXY
Вторая половина почтового индекса
Исключения Позиция 2 + 3 - CIKMOV не используется
Помните, что не используются все возможные коды, поэтому это список является необходимым, но не достаточным условием для действительного кода. Может быть проще просто сопоставить список всех допустимых кодов?
Это позволяет пустым пространствам и вкладкам с обеих сторон в случае, если вы не хотите отказывать в валидации, а затем обрезаете его на стороне.
^\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*$)
Нам дана спецификация:
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
Но заметьте - это позволяет любое количество пробелов между группами.
У меня есть регулярное выражение для проверки подлинности в Великобритании.
Это работает для любого типа почтового индекса, который является внутренним или внешним
^((([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
blockquote>
Основные правила:
^[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)$
Протестировано в отношении базы данных наших клиентов и кажется совершенно точным.
Посмотрите код python на этой странице:
http://www.brunningonline.net/simon/blog/archives/001292.html
У меня есть синтаксический анализ почтового индекса. Требование довольно простое; Я должен разбирать почтовый индекс в outcode и (необязательно). Хорошим новым является то, что мне не нужно выполнять какую-либо проверку - мне просто нужно нарезать то, что мне предоставили смутно разумным образом. Я не могу много думать о моем импорте с точки зрения форматирования, то есть случая и встроенных пространств. Но это не плохая новость; плохая новость заключается в том, что я должен делать все это в RPG. : - (
Тем не менее, я бросил небольшую функцию Python вместе, чтобы прояснить мое мышление.
blockquote>Я использовал его для обработки почтовых индексов для меня.
Принятый ответ отражает правила, данные 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})
Оно также включает дополнительное пространство между первый и второй блоки.
Нет такого понятия, как всеобъемлющее регулярное выражение для почтового индекса в Великобритании, которое способно проверять почтовый индекс. Вы можете проверить, что почтовый индекс находится в правильном формате, используя регулярное выражение; а не то, что он действительно существует.
Почтовые индексы сколь угодно сложны и постоянно меняются. Например, 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», также подтвердят почтовые индексы ряда других стран.
Если вы хотите проверить почтовый индекс в Великобритании, самый безопасный способ сделать это используйте поиск текущих почтовых индексов. Существует ряд опций:
Похоже, мы собираемся использовать ^(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}))$
Это не распространяется на заморские территории и только обеспечивает формат, а не существование разных областей. Он основан на следующих правилах:
Может принимать следующие форматы:
Где:
С наилучшими пожеланиями
Колин
Чтобы добавить к этому списку, более практичное регулярное выражение, которое я использую, позволяет пользователю вводить 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}))$
Это регулярное выражение позволяет писать заглавные и строчные буквы с дополнительным пространством в между
С точки зрения разработчиков программного обеспечения это регулярное выражение полезно для программного обеспечения, где адрес может быть необязательным. Например, если пользователь не захотел предоставить свои данные адреса
Мне нужна версия, которая будет работать в 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;
Старая почта, но все еще довольно высокая в результатах 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})$
из:
Документ также объясняет логику, лежащую в его основе. Тем не менее, он имеет ошибку (полужирный шрифт), а также позволяет использовать нижний регистр, который хотя и не является обычным, так исправленная версия:
^(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) не сделал.
вот как мы имеем дело с проблемой почтового индекса в Великобритании:
^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$
Объяснение:
Это получает большинство форматов, затем мы используем db для проверки подлинности почтового индекса, эти данные управляются с помощью openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html
надеюсь, что это поможет