문제

난 후에 정규식의 유효성을 검사하고 전체의 복잡한 영국의 우편 번호 내에서만 입력 문자열입니다.모든 기타 우편 번호 양식해 덮여 있을 뿐만 아니라 있습니다.예를 들어:

경기

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H7LT

  • aWC2H7LT
  • WC2H7LTa
  • WC2H

어떻게 이 문제를 해결하는가?

도움이 되었습니까?

해결책

우편 번호의 영국 정부 데이터 표준을 살펴 보는 것이 좋습니다. XML 아카이브, 보다 위키 백과 토론을 위해]. 데이터에 대한 간단한 설명이 있으며 첨부 된 XML 스키마는 정규 표현식을 제공합니다. 그것은 당신이 원하는 것이 아니라 좋은 출발점이 될 수 있습니다. REGEX는 주어진 정의에 의해 A9A 9AA 형식의 3 위치의 p 문자가 허용되므로 XML과 약간 다릅니다.

영국 정부가 공급 한 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})

Wikipedia 토론에서 지적한 바와 같이, 이는 비 현실 우편 번호 (예 : AA, ZY를 시작하는 사람들)를 허용하고 시도 할 수있는보다 엄격한 테스트를 제공합니다.

다른 팁

우리가 사용할 것 같습니다 ^(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에 의해 sufgested의 약간 수정 된 버전입니다.

그러나 위에 나열된 다양한 솔루션이 어떤 문자가 허용되는지에 대해 다른 규칙을 적용하는 것처럼 보이기 때문에 규칙이 무엇인지 정확하게 조사해야합니다.

일부 연구 후에는 더 많은 정보를 찾았습니다. 분명히 'govtalk.gov.uk'의 페이지가 우편 번호 사양을 가리 킵니다. govtalk-postcodes. 이것은 XML 스키마를 가리 킵니다 XML 스키마 우편 번호 규칙에 대한 '의사 정규'진술을 제공합니다.

우리는 그것을 취하고 다음과 같은 표현을 제공하기 위해 조금 노력했습니다.

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

이것은 공백을 선택적으로 만들지 만 하나의 공간으로 제한합니다 (무제한 공간의 경우 '&'를 '{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를 제외한 모든 문자 일 수 있습니다.

최고의 소원

콜린

포괄적 인 영국 우편 번호 정규 표현식과 같은 것은 없습니다. 검증 우편 번호. 우편 번호가 정규식을 사용하여 올바른 형식인지 확인할 수 있습니다. 실제로 존재하지 않습니다.

우편 번호는 임의로 복잡하고 끊임없이 변화합니다. 예를 들어, 아웃 코드 W1 모든 우편 번호 영역에 대해 1에서 99 사이의 모든 숫자를 가질 수는 없으며 절대 없습니다.

당신은 현재 영원히 진실이 될 것으로 기대할 수 없습니다. 예를 들어, 1990 년에 우체국은 애버딘이 약간 혼잡 해지고 있다고 결정했습니다. 그들은 AB1-5의 끝에 0을 추가하여 AB10-50을 추가 한 다음 이들 사이에 여러 개의 우편 번호를 만들었습니다.

새로운 거리가 구축 될 때마다 새 우편 번호가 생성됩니다. 건축 허가를 얻는 프로세스의 일부입니다. 지방 당국은 우체국과 함께 업데이트를 유지해야합니다 (모두가 아닙니다).

또한 다른 여러 사용자가 언급 한 바와 같이 Girobank, Gir 0AA 및 Santa에게 보낸 편지, San Ta1과 같은 특별한 우편 번호가 있습니다. 다른 답변으로 덮여 있습니다.

그런 다음 BFPO 우편 코드가 있습니다. 보다 표준 형식으로 변경됩니다. 두 형식 모두 유효합니다. 마지막으로 해외 영토가 있습니다 소스 위키 백과.

+----------+----------------------------------------------+
| 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                     |
+----------+----------------------------------------------+

다음으로, 영국은 우편 번호 시스템을 세계의 많은 곳으로 "내보내기"한다는 점을 고려해야합니다. "영국"우편 번호를 검증하는 것은 다른 여러 국가의 우편 번호를 검증 할 것입니다.

당신이 원한다면 확인 영국 우편 번호 가장 안전한 방법은 현재 우편 번호를 조회하는 것입니다. 여러 옵션이 있습니다.

  • 병기 조사 릴리스 코드 포인트 열기 공개 데이터 라이센스에 따라. 시간 뒤에는 매우 약간 뒤지지 만 무료입니다. 병기 설문 조사에 송금이 없기 때문에 이것은 북 아일랜드 데이터를 포함하지 않을 것입니다. 북 아일랜드의 매핑은 북 아일랜드의 병기 조사에 의해 수행되며, 별도의 유료, 바늘 제품. 당신은 이것을 사용하고 상당히 쉽게 다루지 않은 소수를 추가 할 수 있습니다.

  • Royal Mail을 출시합니다 우편 번호 주소 파일 (PAF), 여기에는 코드 포인트 오픈이 확실하지 않은 BFPO가 포함됩니다. 정기적으로 업데이트되지만 비용이 들었습니다 (때로는 그에 대해 완전히 의미가있을 수 있습니다). PAF에는 우편 번호가 아닌 전체 주소가 포함되어 있으며 자체적으로 제공됩니다. 프로그래머 가이드. Open Data User Group (ODUG)은 현재 PAF를 무료로 출시하도록 로비하고 있습니다. 다음은 그들의 입장에 대한 설명입니다.

  • 마지막으로, 거기에 있습니다 주소 기반. 이것은 Ordnance Survey, Local Authorities, Royal Mail 및 일치하는 회사 간의 협력으로 모든 영국 주소에 대한 모든 정보에 대한 결정적인 디렉토리를 만들었습니다 (그들은 상당히 성공했습니다). 유급이지만 지방 당국, 정부 부서 또는 정부 서비스와 함께 일하는 경우 무료로 사용할 수 있습니다. 단지 우편 번호가 포함 된 것보다 더 많은 정보가 있습니다.

나는 최근에 게시했다 답변 에게 영국에 대한이 질문은 R 언어에 대한 우편 번호. 나는 그것을 발견했다 영국 정부의 Regex 패턴이 잘못되었습니다 그리고 실패합니다 제대로 일부 우편 번호를 확인하십시오. 불행히도, 여기의 많은 답변은이 잘못된 패턴을 기반으로합니다.

아래의 문제 중 일부를 설명하고 수정 된 정규 표현을 제공하겠습니다. 실제로 공장.


메모

내 대답 (일반적으로 정규 표현) :

  • 우편 번호 만 확인합니다 형식.
  • 우편 번호를 보장하지 않습니다 합법적으로 존재합니다.
    • 이를 위해 적절한 API를 사용하십시오! 보다 벤의 대답 더 많은 정보를 위해서.

당신이 신경 쓰지 않는다면 나쁜 동선 그리고 답변으로 건너 뛰고 싶고 아래로 스크롤하십시오. 대답 부분.

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

문제

문제 1- 복사/붙여 넣기

여기에서 사용중인 Regex를 참조하십시오.

많은 개발자가 할 수 있듯이 코드를 복사/붙여 넣기 (특히 정규 표현식)로 붙여 넣을 것으로 예상합니다. 이것은 이론적으로는 훌륭하지만,이 문서의 사본/붙여 넣기/붙여 넣기는 실제로 다음과 같이 캐릭터 (공간) 중 하나를 Newline 문자로 변경하기 때문에 다음과 같이 실패합니다.

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

대부분의 개발자가 할 첫 번째 일은 두 번 생각하지 않고 Newline을 지우는 것입니다. 이제 REGEX는 우편 번호와 공백과 일치하지 않습니다 ( GIR 0AA 우편 번호).

이 문제를 해결하려면 Newline 캐릭터를 공간 문자로 대체해야합니다.

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

문제 2- 경계

여기에서 사용중인 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})|(([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})$
^^                     ^ ^                                                                                                                                            ^^

우편 번호 Regex는 Regex를 부적절하게 고정시킵니다. 값과 같은 값이 있으면 우편 번호를 검증하기 위해이 정규식을 사용하는 사람이라면 누구나 놀랄 수 있습니다. fooA11 1AA 통과합니다. 위의 Regex에서 지적한 것처럼 첫 번째 옵션의 시작과 두 번째 옵션의 끝 (서로 독립적으로)을 정박했기 때문입니다.

이것이 의미하는 바는 것입니다 ^ (라인의 시작에서 위치를 주장) 첫 번째 옵션에서만 작동합니다. ([Gg][Ii][Rr] 0[Aa]{2}), 두 번째 옵션은 우편 번호에서 (이전의 일에 관계없이).

마찬가지로 첫 번째 옵션은 줄 끝에 고정되지 않았습니다. $, 그래서 GIR 0AAfoo 또한 받아 들여집니다.

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

문제 3- 부적절한 문자 세트

여기에서 사용중인 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})|(([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})$
                                                                                       ^^

Regex가 누락되었습니다 - 여기에는 다양한 문자를 나타냅니다. 우편 번호가 형식 인 경우 ANA NAA (어디 A 편지를 나타냅니다 N 숫자를 나타냅니다). A 또는 Z, 실패합니다.

그것은 그것이 일치한다는 것을 의미합니다 A1A 1AA 그리고 Z1A 1AA, 하지만 B1A 1AA.

이 문제를 해결하기 위해 캐릭터 - 사이에 배치해야합니다 A 그리고 Z 각 문자 세트에서 :

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

문제 4- 잘못된 선택적 문자 세트

여기에서 사용중인 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})|(([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})$
                                                                                                                                        ^

나는 그들이 웹에 공개하기 전에 이것을 테스트하지 않았다고 맹세합니다. 그들은 잘못된 캐릭터 세트를 선택적으로 만들었습니다. 그들이 만들었다 [0-9] 옵션 2 (그룹 9)의 네 번째 하위 옵션에서 옵션. 이를 통해 REGEX는 다음과 같이 잘못된 포맷 된 우편 번호를 일치시킬 수 있습니다. AAA 1AA.

이 문제를 해결하려면 다음 문자 클래스를 대신 선택 사항으로 만드십시오 (그리고 이후에 세트를 만드십시오. [0-9] 정확히 한 번 일치) :

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

문제 5- 성능

이 정규식의 성능은 매우 열악합니다. 우선, 그들은 일치 할 가능성이 가장 적은 패턴 옵션을 배치했습니다. GIR 0AA 처음에. 얼마나 많은 사용자 가이 우편 번호와 다른 우편 번호를 가질 것입니다. 아마도 결코? 이것은 Regex를 사용할 때마다 다음 옵션으로 진행하기 전에 먼저이 옵션을 소진해야 함을 의미합니다. 성능이 어떻게 영향을 받는지 확인하려면 단계 수를 확인합니다. 오리지널 리그 (35)에 반대했다 옵션을 뒤집은 후 동일한 정규식 (22).

성능의 두 번째 문제는 전체 Regex가 구성되는 방식 때문입니다. 실패하면 각 옵션을 통해 백 트래킹이 없습니다. 현재 Regex가 구성되는 방식은 크게 단순화 될 수 있습니다. 나는 이것에 대한 수정을 제공한다 대답 부분.

문제 6- 공백

여기에서 사용중인 Regex를 참조하십시오

이것은 고려되지 않을 수 있습니다 문제, 그 자체로, 그러나 그것은 대부분의 개발자에게 우려를 제기합니다. Regex의 공간은 선택 사항이 아니므로 우편 번호를 입력하는 사용자가 우편 번호에 공간을 배치해야합니다. 이것은 단순히 추가하여 쉬운 수정입니다 ? 공백이 옵션을 렌더링 한 후. 참조 대답 수정 섹션.


대답

1. 영국 정부의 정규식 고정

에 요약 된 모든 문제를 수정합니다 문제 섹션 및 단순화 패턴은 다음과 같은 짧고 간결한 패턴을 산출합니다. 우편 번호 전체 (개별 부품이 아님)를 확인하고 있기 때문에 대부분의 그룹을 제거 할 수 있습니다.

여기에서 사용중인 Regex를 참조하십시오

^([A-Za-z][A-Ha-hJ-Yj-y]?[0-9][A-Za-z0-9]? ?[0-9][A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$

이는 사례 중 하나 (상부 또는 소문자)에서 모든 범위를 제거하고 케이스에 민감하지 않은 플래그를 사용하여 더욱 단축 될 수 있습니다. 메모: 일부 언어에는 하나가 없으므로 더 긴 언어를 사용하십시오. 각 언어는 사례 감도 플래그를 다르게 구현합니다.

여기에서 사용중인 Regex를 참조하십시오.

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

다시 교체합니다 [0-9] ~와 함께 \d (REGEX 엔진이 지원하는 경우) :

여기에서 사용중인 Regex를 참조하십시오.

^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

2. 단순화 된 패턴

특정 알파벳 문자를 보장하지 않고 다음을 사용할 수 있습니다 (단순화를 명심하십시오. 1. 영국 정부의 정규식 고정 여기에도 적용되었습니다) :

여기에서 사용중인 Regex를 참조하십시오.

^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$

그리고 당신이 특별한 경우에 신경 쓰지 않는다면 GIR 0AA:

^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$

3. 복잡한 패턴

나는 새로운 영역, 학군 및 하위 지구인이 언제라도 나타날 수 있으므로 우편 번호의 과도한 검증을 제안하지 않을 것입니다. 내가 제안 할 것 잠재적으로 수행하면 에지 케이스에 대한 지원이 추가됩니다. 일부 특별한 경우가 존재하며 요약되어 있습니다 이 위키 백과 기사.

다음은 하위 섹션을 포함하는 복잡한 동정인입니다 3. (3.1, 3.2, 3.3).

패턴과 관련하여 1. 영국 정부의 정규식 고정:

여기에서 사용중인 Regex를 참조하십시오

^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

그리고 관련하여 2. 단순화 된 패턴:

여기에서 사용중인 Regex를 참조하십시오

^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$

3.1 영국 해외 영토

Wikipedia 기사는 현재 상태에 있습니다 (일부 형식은 약간 단순화 됨) :

  • AI-1111: 안달라
  • ASCN 1ZZ: 승천 섬
  • STHL 1ZZ: 세인트 헬레나
  • TDCU 1ZZ: Tristan da Cunha
  • BBND 1ZZ: 영국 인도양 영토
  • BIQQ 1ZZ: 영국 남극 영토
  • FIQQ 1ZZ: 포클랜드 제도
  • GX11 1ZZ: 지브롤터
  • PCRN 1ZZ: Pitcairn Islands
  • SIQQ 1ZZ: 사우스 조지아와 사우스 샌드위치 제도
  • TKCA 1ZZ: 터키와 카이 코스 제도
  • BFPO 11: Akrotiri와 Dhekelia
  • ZZ 11 & GE CX: 버뮤다 (에 따르면 이 문서)
  • KY1-1111: Cayman Islands (에 따르면 이 문서)
  • VG1111: 영국령 버진 아일랜드 (에 따르면 이 문서)
  • MSR 1111: Montserrat (에 따르면 이 문서)

영국 해외 영토에만 일치하는 모든 포괄적 인 Regex는 다음과 같이 보일 수 있습니다.

여기에서 사용중인 Regex를 참조하십시오.

^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$

3.2 영국군 우체국

최근에 영국 우편 번호 시스템과 더 잘 맞도록 변경되었지만 BF# (어디 # 숫자를 나타냅니다), 그들은 고려됩니다 선택적 대체 우편 번호. 이 우편 번호는 (ed)의 형식을 따릅니다 BFPO, 그 다음에 1-4 자리 :

여기에서 사용중인 Regex를 참조하십시오

^BFPO ?\d{1,4}$

3.3 산타?

산타와의 또 다른 특별한 사례가 있습니다 (다른 답변에서 언급 한 바와 같이) : SAN TA1 유효한 우편 번호입니다. 이것에 대한 정수는 매우 간단합니다.

^SAN ?TA1$

나는 모양으로의 위에 나는 추천에 대한 패턴을 사용하여서@Dan 답변(c.Dec15'10), 이후,그것은 잘못 거의 플래그 0.4%의 유효한 우편 번호가 잘못된 것으로,다른 하지 않습니다.

병기 조사 서비스를 제공하라는 코드는 지점에는:

목록을 포함하는 모든 현재의 우편 번호를 단위를 영국에서

나는 각각의 regexs 에 대해 위의 전체 목록의 우편 번호(6Jul'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,686,202 우편 번호 total.

다음 숫자의 유효한 우편 번호는 경기 각 $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)$

유효한 영국 우편 번호와 일치하는 정규 표현. 영국 우편 시스템에서 모든 편지가 모든 위치 (차량 등록 판과 동일)에 사용되는 것은 아니며이를 관리하는 다양한 규칙이 있습니다. 이 REGEX는 이러한 규칙을 고려합니다. 규칙의 세부 사항 : 우편 번호의 상반기 유효한 형식의 상반기 [az] [az] [0-9] [az] [az] [az] [0-9] [0-9] [az] [0-9]. 0-9] [az] [az] [0-9] [az] [az] [az] [az] [az] [0-9] [az] [az] [0-9] 예외 위치-먼저. 기부 -QVX가 사용되지 않음 - 두 번째. 기부 -Gir 0AA 위치를 제외하고 IJZ는 사용하지 않습니다 - 세 번째. 제약 - aehmnprtvxy 만 사용 된 위치. 기부 -Abehmnprvwxy 우편 번호 유효 형식의 후반 [0-9] [az] [az] 예외 위치 - 두 번째 및 세 번째. 기부 -Cikmov는 사용되지 않습니다

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

여기의 대부분의 답변은 데이터베이스에있는 모든 우편 번호에 대해 효과가 없었습니다. 나는 마침내 정부가 제공 한 새로운 Regex를 사용하여 모두와 검증하는 것을 발견했습니다.

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/41338/bulk_data_transfer_-_additional_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})$

업데이트 : Jamie Bull이 지적한 REGEX 업데이트. 그것이 내 오류 복사인지 아니면 정부의 정수에서 오류인지 확실하지 않으면 링크가 이제 다운되었습니다 ...

업데이트 : CTWheeels가 발견 한대로이 REGEX는 JavaScript Regex Flavor와 함께 작동합니다. PCRE (PHP) 맛과 함께 작동하는 것에 대한 그의 의견을보십시오.

이 Wikipedia 테이블에 따르면

enter image description here

이 패턴은 모든 경우를 다룹니다

(?:[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})

안드로이드에서 사용할 때 java use d

오래된 게시물이지만 여전히 Google 결과는 매우 높기 때문에 업데이트 할 것이라고 생각했습니다. 이 10 월 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_-_additional_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})$

이것은 이전 버전이하지 않은 New London Postcodes (예 : W1D 5LH)와 함께 작동합니다.

이것은 Google에 대한 Regex 서비스입니다 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

나에게 이것은 가능한 한 많이 검증하는 것 사이의 올바른 균형이며, 동시에 미래 방지 및 유지 보수가 쉽게 허용됩니다.

나는 마지막 날 정도의 영국 우편 번호 Regex를 찾고 있었고이 스레드를 우연히 발견했습니다. 나는 위의 대부분의 제안을 통해 내 방식대로 일했고 그들 중 어느 것도 나를 위해 일하지 않았으므로, 내가 아는 한, 1 월 13 일 기준으로 모든 유효한 영국 우편 번호를 포착하는 내 자신의 동정인을 생각해 냈습니다 (최신 문헌에 따르면. 왕실 메일).

REGEX 및 일부 간단한 우편 번호 확인 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에 직접 연락하여 자신의 말로 "자신의 말로"Aana Naa 형식을 갖는 외부 코드의 4 번째 위치에있는 문자는 예외가 없으며 세 번째 위치 예외는 외부 코드의 마지막 문자에만 적용됩니다. 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>";

    }

?>

솔루션을 찾기 위해이 스레드를 만날 다른 사람을 도울 수 있기를 바랍니다.

다음은 Marcj의 답변에 연결된 문서에 지정된 형식을 기반으로 한 정규식입니다.

/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/

그것과 사양의 유일한 차이점은 사양에 따라 마지막 2자가 [cikmov]에있을 수 없다는 것입니다.

편집 : 다음은 후행 문자 제한을 테스트하는 다른 버전입니다.

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

위의 정규식 중 일부는 약간 제한적입니다. 진정한 우편 번호는 다음과 같이 주목하십시오. "W1K 7AA"는 규칙을 고려할 때 실패 할 것입니다.

동정인 :

^(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 기사 '영국의 우편 번호'라는 제목.

이 REGEX에는 대문자 전용 문자가 필요합니다.

더 큰 문제는 실제로 존재하는 우편 번호 만 허용하도록 사용자 입력을 제한하는지 또는 단순히 사용자가 양식 필드에 완전한 쓰레기를 입력하는 것을 막으려 고하는지 여부입니다. 가능한 모든 우편 번호를 올바르게 일치시키고 미래의 교정은 더 어려운 퍼즐이며, HMRC가 아니라면 가치가 없을 것입니다.

기본 규칙 :

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

영국의 우편 번호 (또는 우편 번호가 불리는 우편 번호)는 공간으로 분리 된 5 ~ 7 개의 영숫자로 구성됩니다. 특정 위치에 나타날 수있는 캐릭터를 다루는 규칙은 다소 복잡하고 예외가 있습니다. 따라서 방금 표시된 정규 표현은 기본 규칙을 고수합니다.

완전한 규칙 :

가독성을 희생하여 우편 번호 규칙에 대한 모든 상자를 진드기로하는 Regex가 필요한 경우 다음과 같습니다.

^(?:(?:[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

고객 데이터베이스에 대해 테스트했으며 완벽하게 정확해 보입니다.

나는 모든 유효한 영국 우편 코드에 대해 테스트 한 다음과 같은 regex를 사용합니다. 권장 규칙을 기반으로하지만 합리적으로 압축되며 특별한 언어 별 Regex 규칙을 사용하지 않습니다.

([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"우편 번호는 제외되며 우편 번호의 공식 우체국 목록에 있지 않으므로 등록 된 주소로 사용되지 않는 한 유효성 검사를받지 않습니다. 필요한 경우 특별한 경우에 사소해야합니다.

우편 번호의 상반기 유효한 형식

  • 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 -gir 0aa를 제외하고는 사용되지 않습니다.
위치 3 -aehmnprtvxy 만 사용됩니다
위치 4 -Abehmnprvwxy

우편 번호의 후반

  • 0-9] [AZ] [AZ

예외
위치 2+3 -Cikmov는 사용되지 않습니다

가능한 모든 코드가 사용되는 것은 아니므 로이 목록은 유효한 코드에 필요한 조건이지만 충분하지는 않습니다. 모든 유효한 코드 목록과 일치하는 것이 더 쉬울 수 있습니까?

우리가 영국 우편 번호 문제를 다루는 방법은 다음과 같습니다.

^([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

도움이 되었기를 바랍니다

우편 번호를 확인하려면 Royal Mail의 경우 유효한 형식입니다. 프로그래머 가이드:

          |----------------------------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 더 이상 사용하지 않는 사람들을 제외하고는 일치합니다.

추가 a ? 공간 이후와 케이스 불신성 일치를 사용 하여이 질문에 답하십시오.

'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" ]

이것은 검증에 실패하지 않고 심하게 다듬지 않는 경우 양쪽에서 빈 공간과 탭을 허용합니다.

^\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*$)

나는 너무 많은 것을 허용하는 것이 좋지만 유효한 우편 번호를 거부하지는 않는 간단한 정규식을 원했습니다. 나는 이것과 함께 갔다 (입력은 스트리핑/손질 된 문자열) :

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

길이 5 ~ 7 (공백을 세지 않음)은 "L1 8JQ"와 같은 가장 짧은 우편 번호뿐만 아니라 "OL14 5ET"와 같은 가장 긴 우편 번호를 허용합니다.

편집 : 8 문자 우편 번호를 허용하지 않도록 8을 7로 변경했습니다.

이 목록에 사용자가 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}))$

이 REGEX는 자본 및 소문자 문자가 옵션 공간을 갖춘 소문자를 허용합니다.

소프트웨어 개발자 관점 에서이 REGEX는 주소가 선택적 일 수있는 소프트웨어에 유용합니다. 예를 들어 사용자가 주소 세부 정보를 제공하고 싶지 않은 경우

이 페이지에서 파이썬 코드를 살펴보십시오.

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

우편 번호 구문 분석을 할 수 있습니다. 요구 사항은 매우 간단합니다. 우편 번호를 아웃 코드로 구문 분석하고 (선택 사항) 인코드로 구문 분석해야합니다. 좋은 새로운 것은 검증을 수행 할 필요가 없다는 것입니다. 모호한 지능적인 방식으로 제공 한 것을 자르면됩니다. 서식, 즉 사례 및 임베디드 공간 측면에서 내 수입에 대해 많이 가정 할 수 없습니다. 그러나 이것은 나쁜 소식이 아닙니다. 나쁜 소식은 내가 RPG에서 모든 것을해야한다는 것입니다. :-(

그럼에도 불구하고, 나는 내 생각을 명확히하기 위해 약간의 파이썬 기능을 함께 던졌습니다.

나는 그것을 사용하여 우편 번호를 처리했습니다.

우리는 사양을 받았습니다.

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

그러나 참고 - 이것은 그룹 간의 수많은 공간을 허용합니다.

영국 우편 번호 검증에 대한 Regex가 있습니다.

이것은 내부 또는 외부의 모든 유형의 우편 번호에 대해 작동합니다.

^((([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 --------------------> 외부 우편 번호 만

A1 1AA ----------------> (외부 및 내부) 우편 번호의 조합

WC2A -------------------> 외부

수락 된 답변은 Royal Mail이 제공 한 규칙을 반영하지만 Regex에는 오타가 있습니다. 이 오타는 gov.uk 사이트에있는 것 같습니다 (XML 아카이브 페이지에있는 것처럼).

A9A 9AA 형식으로 규칙은 3 위치에서 p 문자를 허용하는 반면, Regex는 이것을 무시합니다. 올바른 정규식은 다음과 같습니다.

(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}) 

이로 인해 다음과 같은 regex가 발생합니다 (Perl/Ruby Syntax를 사용) :

(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})

또한 첫 번째 블록과 두 번째 블록 사이의 선택적 공간이 포함되어 있습니다.

Bulk Transfer PDF의 거의 모든 변형과 재 렉스에서 찾은 것은 Wikipedia 사이트의 것, 특히 Wikipedia Regex의 경우, 첫 번째 | (수직 막대) 이후 A ^가 필요하다는 것입니다. AA9A 9AA를 테스트하여 이것을 알아 냈습니다. 그렇지 않으면 A9A 9AA에 대한 형식 검사가 검증 될 것이기 때문입니다. 예를 들어 C1D 1BB가 유효한 형식이므로 유효하지 않은 EC1D 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})$

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;

아래 메소드는 포스트 코드를 확인하고 완전한 정보를 제공합니다.

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = `${fromat[1]} ${fromat[2]}`;
        const 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})|(([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})$/i;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}

나는 이것을 XML 문서에서 훔쳤으며 하드 코딩 된 GIRO없이 모든 사례를 다루는 것 같습니다.

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(무시 사건이있는 루비 구문)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top