영국 우편 번호 일치를위한 RegEx


186

입력 문자열 내에서만 전체 복잡한 영국 우편 번호의 유효성을 검사하는 정규 표현식을 따릅니다. 일반적이지 않은 모든 드문 우편 번호 양식이 포함되어야합니다. 예를 들어 :

성냥

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

일치하지 않습니다

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

이 문제를 어떻게 해결합니까?


2
도움이되지 않는 @axrwkr
Kieran Benton

8
영국 우편 번호 유효성 검사-JavaScript 및 PHP 유효한 우편 번호와 일치하는 허용 된 답변을 얻을 수 없지만 이것을 찾았으며 유효한 우편 번호와 일치합니다. 클라이언트 쪽 유효성 검사의 경우 JavaScript 버전을 그대로 사용할 수 있으며 서버 쪽 유효성 검사의 경우 C #을 매우 간단하게 JavaScript를 다시 작성할 수 있습니다. 공백을 갖도록 우편 번호를 다시 형식화하기도하므로 유효성 검사 외에 우편 번호를 W1A1AA로 입력하면 W1A 1AA로 형식이 재 지정됩니다. 다양한 영국 영토의 특이한 우편 번호도 처리합니다.

2
제공된 링크가 "AA1A 1AA"형식에 작동하지 않습니다. 참조 : dhl.com.tw/content/dam/downloads/tw/express/forms/…
Anthony Scaife

1
단순히 우편 번호의 유효성을 검사하려는 경우 무료 (등록 필요) 유효성 검사 REST API 엔드 포인트 ( developers.alliescomputing.com/postcoder-web-api/address-lookup/)를 제공합니다.
Stephen Keable

1
좋은 질문. 일치해야하는 일반적이지 않은 예제 목록에 "M1 3HZ"와 같은 중앙 맨체스터 우편 번호를 포함시키는 것이 좋습니다. 많은 사람들이 1 문자 1 숫자 콤보를 알지 못합니다.
Martin Joiner

답변:


208

우편 번호에 대한 영국 정부 데이터 표준을 살펴 보는 것이 좋습니다. [link now dead; XML 아카이브 , Wikipedia 참조 를 ]. 데이터에 대한 간단한 설명이 있으며 첨부 된 xml 스키마는 정규식을 제공합니다. 정확히 원하는 것은 아니지만 좋은 출발점이 될 것입니다. A9A 9AA 형식의 세 번째 위치에있는 P 문자가 주어진 정의에 의해 허용되므로 RegEx는 XML과 약간 다릅니다.

영국 정부가 공급 한 정규식은 다음과 같습니다.

([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를 시작하는 우편 번호)를 허용하며 시도 할 수있는보다 엄격한 테스트를 제공합니다.


52
그리고 두 세그먼트 사이에 선택적인 공백이있는 정규식 (GIR 0AA) | ((([AZ- [QVX]] [0-9] [0-9]?)] (([AZ- [QVX]] [AZ- [IJZ]] [0-9] [0-9]?) | (([AZ- [QVX]] [0-9] [A-HJKSTUW]) | ([AZ- [QVX]] [ AZ- [IJZ]] [0-9] [ABEHMNPRVWXY])))) \ s? [0-9] [AZ- [CIKMOV]] {2})
gb2d

7
페이지가 매년 만료되는 것처럼 보이기 때문에 실제 정규 표현식을 답변에 포함시키는 것이 좋습니다.
pauloya

7
이 정규 표현식은 XML 스키마에 대한 것으로, 다른 정규 표현식과 약간 다릅니다.
artbristol

6
JavaScript로 작동시키지 않습니다. 특정 정규식 엔진에서만 작동합니까?
NickG

12
실제로 그들은 그것을 변경 : 대량 데이터 전송 :^([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})$
wieczorek1990

85

우리가 사용할 것 같습니다 ^(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 스키마 우편 번호 규칙의 '의사 정규식'문을 제공합니다.

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

^((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를 제외한 모든 문자가 될 수 있습니다.

최고의 소원

콜린


2
대단한 답변, 해외에 추가^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[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}))$
David Bradshaw

무제한의 선택적 공백 {0,}대신 지정 해야하는 이유는 무엇 *입니까?
코드 동물

76

최근 에이 질문에 대한 답변R 언어의 영국 우편 번호 에 게시 했습니다 . 영국 정부의 정규식 패턴이 잘못되어 제대로 작동 하지 않음을 발견했습니다 . 일부 우편 번호의 유효성 검사 . 불행히도, 여기의 많은 답변은이 잘못된 패턴을 기반으로합니다.

아래에서 이러한 문제 중 일부를 간략하게 설명하고 실제로 작동 하는 수정 된 정규식을 제공 합니다.


노트

내 대답 (및 일반적인 정규 표현식) :

  • 우편 번호 형식 만 확인 합니다.
  • 우편 번호가 합법적으로 존재 하는지 확인하지는 않습니다 .
    • 이를 위해 적절한 API를 사용하십시오! 자세한 내용은 Ben의 답변 을 참조하십시오.

잘못된 정규식에 신경 쓰지 않고 답변으로 건너 뛰려면 답변 섹션으로 스크롤 하십시오.

나쁜 정규식

이 섹션의 정규식은 사용하지 않아야합니다.

이것은 영국 정부가 개발자들에게 제공 한 정규 표현식입니다 (이 링크의 길이는 확실하지 않지만 대량 데이터 전송 문서 에서 볼 수 있습니다 ).

^([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-복사 / 붙여 넣기

여기서 사용중인 정규식을 참조하십시오 .

많은 개발자가 할 수 있듯이 코드 (특히 정규식)를 복사 / 붙여 넣기하고 작동 할 것으로 예상하여 붙여 넣습니다. 이론적으로는 훌륭하지만이 경우이 문서에서 복사 / 붙여 넣기를하면 실제로 문자 (공백) 중 하나가 개행 문자로 변경되므로이 경우에는 실패합니다.

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

대부분의 개발자가 할 첫 번째 일은 두 번 생각하지 않고 개행을 지우는 것입니다. 이제 정규 표현식은 공백이있는 우편 번호와 일치하지 않습니다 (GIR 0AA 우편 번호 제외).

이 문제를 해결하려면 줄 바꾸기 문자를 공백 문자로 바꿔야합니다.

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

여기서 사용중인 정규식을 참조하십시오 .

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

우편 번호 정규식이 정규식을 잘못 고정합니다. 이 정규식을 사용하여 우편 번호의 유효성을 검사하는 사람은 같은 값 fooA11 1AA이 통과 하면 놀랄 수 있습니다 . 위의 정규 표현식에서 지적했듯이 첫 번째 옵션의 시작과 두 번째 옵션의 끝을 서로 독립적으로 고정했기 때문입니다.

이것이 의미하는 것은 ^(줄 시작시 위치를 주장한다) 첫 번째 옵션에서만 작동 ([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-부적절한 문자 세트

여기서 사용중인 정규식을 참조하십시오 .

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

정규식 -에 문자 범위를 나타내는 여기 가 없습니다 . 우편 번호가 형식 ANA NAA( A문자를 N나타내고 숫자를 나타냄)으로되어 A있거나 또는 이외의 것으로 시작 Z하면 실패합니다.

그 수단이 일치 A1A 1AA하고 Z1A 1AA있지만 B1A 1AA.

이 문제를 해결하려면 문자 -AZ문자 세트 사이에 배치해야합니다 .

^([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-잘못된 선택 문자 세트

여기서 사용중인 정규식을 참조하십시오 .

^([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)의 네 번째 하위 옵션에서 옵션을 만들었습니다 . 이렇게하면 정규식이와 같은 형식이 잘못된 우편 번호와 일치 할 수 있습니다 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처음에 맞췄습니다. 이 우편 번호와 다른 우편 번호를 가진 사용자 수는 몇 명입니까? 아마 절대? 이것은 정규식을 사용할 때마다 다음 옵션으로 진행하기 전에이 옵션을 먼저 소모해야 함을 의미합니다. 성능에 미치는 영향을 보려면 옵션을 뒤집은 후 원래 정규식동일한 정규식 에 대해 수행 한 단계 수 (35)를 확인하십시오 (22).

성능의 두 번째 문제는 전체 정규식이 구성되는 방식 때문입니다. 각 옵션에 실패하면 역 추적 할 수 없습니다. 현재 정규식이 구성되는 방식을 크게 단순화 할 수 있습니다. 답변 섹션 에서 이에 대한 수정 사항을 제공합니다 .

문제 6-공백

여기에 사용중인 정규 표현식을 참조하십시오

이것은 그 자체로 는 문제 로 간주되지 않을 수도 있지만 대부분의 개발자들에게는 우려를 불러 일으 킵니다. 정규식의 공백은 선택 사항이 아닙니다. 즉, 우편 번호를 입력하는 사용자는 우편 번호에 공백을 두어야합니다. ?공백 다음에 공백을 추가 하여 선택적으로 렌더링 하면 쉽게 해결할 수 있습니다. 수정 사항 은 응답 섹션을 참조하십시오 .


대답

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

문제점 섹션에 요약 된 모든 문제를 수정 하고 패턴을 단순화하면 다음과 같이 짧고 간결한 패턴이 생성됩니다. 우편 번호를 전체적으로 (개별 부분이 아닌) 검증하기 때문에 대부분의 그룹을 제거 할 수도 있습니다.

여기에 사용중인 정규 표현식을 참조하십시오

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

대소 문자 중 하나 (대 / 소문자)에서 대 / 소문자를 구분하지 않는 플래그를 사용하여 모든 범위를 제거하여 더 단축 할 수 있습니다. 참고 : 일부 언어에는 언어가 없으므로 위의 긴 언어를 사용하십시오. 각 언어는 대소 문자를 구분하지 않는 플래그를 구현합니다.

여기서 사용중인 정규식을 참조하십시오 .

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

다시 교체 짧은 [0-9]\d(당신의 정규식 엔진에서 지원하는 경우) :

여기서 사용중인 정규식을 참조하십시오 .

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

2. 단순화 된 패턴

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

여기서 사용중인 정규식을 참조하십시오 .

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

여기에 사용중인 정규 표현식을 참조하십시오

^(([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. 단순화 패턴 과 관련하여 :

여기에 사용중인 정규 표현식을 참조하십시오

^(([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트리스탄 다 쿠냐
  • BBND 1ZZ영국령 인도양 지역
  • BIQQ 1ZZ: 영국 남극 지역
  • FIQQ 1ZZ포클랜드 제도
  • GX11 1ZZ: 지브롤터
  • PCRN 1ZZ핏 케언 제도
  • SIQQ 1ZZ사우스 조지아 및 사우스 샌드위치 제도
  • TKCA 1ZZ: 터크 스케이 커스 제도
  • BFPO 11: 아크로티리와 데켈리아
  • ZZ 11& GE CX: 버뮤다 ( 이 문서 에 따름 )
  • KY1-1111: 케이맨 제도 ( 이 문서 에 따름 )
  • VG1111영국령 버진 아일랜드 ( 이 문서 에 따름 )
  • MSR 1111: 몬세 라트 ( 이 문서 에 따름 )

영국 해외 영토에만 일치하는 모든 정규식은 다음과 같습니다.

여기서 사용중인 정규식을 참조하십시오 .

^((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#(여기서 #숫자를 나타냄) 에 더 잘 맞도록 변경되었지만 선택적 우편 번호로 간주됩니다 . 이 우편 번호는 형식을 BFPO따르고 (1-4 자리)입니다.

여기에 사용중인 정규 표현식을 참조하십시오

^BFPO ?\d{1,4}$

3.3 산타?

산타에는 또 다른 특별한 경우가 있습니다 (다른 답변에서 언급했듯이). SAN TA1유효한 우편 번호입니다. 이것에 대한 정규식은 매우 간단합니다.

^SAN ?TA1$

4
단순화 된 패턴은 사용하기에 정말 좋은 옵션입니다. 정규식으로 너무 제한적이지 않는 것이 가장 좋습니다. 그런 다음 변경 사항으로 업데이트해야하거나 매우 화가 난 사용자가있을 수 있습니다. 나는 명백한 오류를 제거하고 주소 조회 (또는 이메일 정규식의 경우 확인 이메일)와 같은 추가 검사를 적용하여 유효성을 확인하기 위해 단순화 된 정규식과 느슨하게 일치하는 것이 좋습니다.
James Coyle

2
우수하고 철저한 분석.
Steve

1
많은 수준에서 훌륭한 답변. 궁극적으로 나는 두 번째 단순화 된 패턴을 사용했습니다. 실제로 모든 영국 우편 번호가있는 DB가 있으므로 주소 문자열에 잠재적으로 유효한 우편 번호가 포함되어 있는지 확인하기 위해 첫 번째 패스가 필요하므로 잘못된 검색에 신경 쓰지 않습니다 (실제 조회는 근절) 하지만 허위 부정에 관심이 있습니다. 그리고 속도도 중요합니다.
존 파월

영국 우편 번호 시스템에는 컴퓨터 시대 이전에위원회가 만든 많은 문제가 있지만 가변 길이 및 공백 문제는 가장 치명적입니다. 나는 E1 5JX에서 E1 5JX와 같은 패딩 우편 번호, 즉 3 개의 공백을 포함하여 모든 방식의 공포를 보았습니다. 제정신의 유일한 해결책 인 IMHO는 모든 공간을 제거하는 것이므로, 우편 번호는 Elastic, Solr, Postgres 등 근처에 오기 전에 단일 문자열이됩니다.
John Powell

45

우편 번호를 확인할 수있는 종합적인 영국 우편 번호 정규식과 같은 것은 없습니다 . 정규식을 사용하여 우편 번호가 올바른 형식인지 확인할 수 있습니다. 실제로 존재하는 것은 아닙니다.

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

현재 무엇이 사실인지 영원히 기대할 수는 없습니다. 예를 들어, 1990 년 우체국은 애버딘이 조금 혼잡 해지기로 결정했습니다. AB1-5의 끝에 0을 추가하여 AB10-50으로 만들고 그 사이에 여러 개의 우편 번호를 만들었습니다.

새로운 도로가 건설 될 때마다 새로운 우편 번호가 생성됩니다. 빌드 권한을 얻는 프로세스의 일부입니다. 지역 당국은 우체국으로이 정보를 업데이트 할 의무가 있습니다 (모두가 아닌).

또한 다른 많은 사용자가 언급했듯이 Girobank, GIR 0AA와 같은 특별한 우편 번호와 SAN TA1 산타에게 보내는 편지가 있습니다. 아무 것도 게시하고 싶지 않지만 보이지 않는 것처럼 보입니다 다른 답변으로 덮여 있습니다.

그런 다음 BFPO 우편 번호 가 더 표준 형식으로 변경됩니다 . 두 형식 모두 유효합니다. 마지막으로, 해외 영토 소스 Wikipedia가 있습니다.

+ ---------- + -------------------------------------- -------- +
| 우편 번호 | 위치 |
+ ---------- + -------------------------------------- -------- +
| AI-2640 | 앵 gu 라 |
| ASCN 1ZZ | 어센션 아일랜드 |
| STHL 1ZZ | 세인트 헬레나 |
| TDCU 1ZZ | 트리스탄 다 쿠냐 |
| BBND 1ZZ | 영국령 인도양 지역 |
| BIQQ 1ZZ | 영국 남극 지역 |
| FIQQ 1ZZ | 포클랜드 제도 |
| GX11 1AA | 지브롤터 |
| PCRN 1ZZ | 핏 케언 제도 |
| SIQQ 1ZZ | 사우스 조지아 및 사우스 샌드위치 제도 |
| TKCA 1ZZ | 터크 스케이 커스 제도 |
+ ---------- + -------------------------------------- -------- +

다음으로 영국은 우편 번호 시스템을 세계 여러 곳으로 "내 보냈다"는 점을 고려해야합니다. "UK"우편 번호를 확인하는 모든 항목은 다른 여러 국가의 우편 번호도 확인합니다.

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

  • Ordnance Survey 는 공개 데이터 라이센스로 Code-Point Open을 릴리스 합니다. 시간이 약간 뒤에 있지만 무료입니다. 병기 조사는 송금하지 않았으므로 북 아일랜드 데이터를 포함하지 않을 것입니다. 북 아일랜드의지도는 북 아일랜드의 Ordnance Survey에 의해 수행되며 별도의 유료 유료 포인터 제품이 있습니다. 이것을 사용하고 꽤 쉽게 다루지 않은 몇 가지를 추가 할 수 있습니다.

  • Royal Mail은 PAF (Postcode Address File)를 출시합니다. 여기에는 Code-Point Open이 확실하지 않은 BFPO가 포함됩니다. 정기적으로 업데이트되지만 비용이 많이 듭니다 (때때로 완전히 의미가있을 수 있습니다). PAF는 단순한 우편 번호가 아닌 전체 주소를 포함하며 자체 프로그래머 안내서 와 함께 제공됩니다 . ODUG (Open Data User Group)는 현재 PAF를 무료로 출시하기 위해 로비 입니다. 여기에 해당 위치에 대한 설명이 있습니다.

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


룩업 흥미로운 소리
SuperUberDuper

2
이것은 op가 찾고 있던 대답이 아니지만 아마도 가장 유용 할 것입니다. 이것은 내가 할 검사 규칙을 완화하도록 장려 할 것입니다.
John Hunt

22

위의 답변 중 일부를 살펴본 결과 @ Dan 's answer (c. Dec 15 '10) 의 패턴을 사용하지 않는 것이 좋습니다 . 유효한 우편 번호의 거의 0.4 %가 유효하지 않은 것으로 잘못 표시되어 있기 때문입니다. .

병기 조사는 Code Point Open이라는 서비스를 제공합니다.

영국의 모든 현재 우편 번호 목록을 포함합니다.

이 데이터에서 전체 우편 번호 목록 (Jul 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,686,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

잘못된 우편 번호를 필터링하는 데 가장 적합한 패턴에 대해 아무 말도하지 않습니다.


1
내 대답에 내가 말한 것이 아닌가 당신이 disproof route를 내려 가고 있다면 아마도 모든 것을해야하고 누군가가 대답을 바꾸면 계속 업데이트해야합니까? 그렇지 않은 경우, 적어도 답변을 마지막으로 수정 한 날짜를 참조하여 사람들이 그 이후로 변경되었는지 확인할 수 있습니다.
Ben

페어 포인트. 이에 따라 편집되었습니다. 이러한 패턴의 대부분이 CPO 코드를 배제하지는 않지만 가장 올 바르고 (정규화 된 정규식) 답변은 그렇지 않다는 점을 논의에 추가한다고 생각합니다. 미래 독자 : 내 결과가 오래되었을 수 있습니다.
RichardTowers

17
^([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] 예외 위치-먼저. 제약 조건-QVX 사용되지 않음 위치-초. 제약 조건-GIR 0AA 위치-세 번째를 제외하고는 IJZ가 사용되지 않습니다. 구속 조건-AEHMNPRTVXY는 위치-포스 만 사용했습니다. 제약 조건-ABEHMNPRVWXY 우편 번호의 후반 유효한 형식 [0-9] [AZ] [AZ] 예외 위치-두 번째 및 세 번째. 제약 조건-CIKMOV 사용되지 않음

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


1
사람들이 왜이 답변을 다운 보트했는지 모릅니다. 올바른 정규 표현식입니다.
Ollie

정규식은 Javscript의 우편 번호 "YO31"및 "YO31 1"에 대해 작동하지 않습니다.
Pratik Khadloya

9
주어진 정규 표현식이 설명과 모순되기 때문에 이것이 옳지 않다고 생각하며 0-9,로 시작하는 우편 번호를 가질 수 있다고 제안합니다.
Luigi Plinge

4
이 정규식은 약 6000 개의 유효한 우편 번호에서 실패하므로 권장하지 않습니다. 내 답변을 참조하십시오 .
RichardTowers

소문자 나 공백이없는 우편 번호에서 실패합니다
댄서

14

이 위키 백과 표에 따르면

여기에 이미지 설명을 입력하십시오

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

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


gov.uk 웹 사이트에서 정보를 가져 오는 솔루션에 따라 실제 유효한 코드가 아닌 우편 번호의 형태 만 찾지 만 가장 읽기 쉬운 대답을 찾았지만 사용 사례에 충분합니다. 파이썬으로 조금 연주 한 후에는 옵션 공간을 허용하는 약간 더 작지만 동등한 정규 표현식으로 계산했습니다. ([a-zA-Z] (? : (? : [a-zA- Z]? \ d [a-zA-Z]) | (? : \ d {1,2}) | (? : [a-zA-Z] \ d {1,2})) \ W? [0 -9] [a-zA-Z] {2})
Richard J

14

여기에있는 대부분의 답변은 데이터베이스에있는 모든 우편 번호에서 작동하지 않았습니다. 나는 마침내 정부가 제공 한 새로운 정규식을 사용하여 모두와 함께 유효한 것을 발견했습니다.

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/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이 지적한대로 정규식을 업데이트했습니다. 그것이 내 오류 복사인지 또는 정부 정규 표현식의 오류인지 확실하지 않은 경우 링크가 현재 다운되었습니다 ...

업데이트 : ctwheels가 발견하면이 정규식은 자바 정규식 풍미와 함께 작동합니다. pcre (php) 플레이버와 작동하는 것에 대한 그의 의견을 참조하십시오.


1
^([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})|(([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})$- 차이 ;-) 자리
제이미 불

1
에 딱 맞다! 내 답변을 업데이트했습니다. 감사!
Jesús Carrera

2
이것은 regexr.com 및 Notepad ++ 에서 작동 한 유일한 답변 입니다. 나는 변화를했다,하지만 그것은합니다 ([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})(제거 ^하고 $그리고 추가 ?공간 후)에 대한 regexr.com 하나 개 이상의 결과를 찾을 수 모두를위한 공간 구분자가없는 결과를 찾을 수 있습니다.
mythofechelon

@ctwheels이 정규식은 자바 스크립트 맛입니다. 실패한 링크를 사용하면 javascript를 선택하면 작동합니다. 그것은 큰 캐치이며 내 대답을 업데이트 할 것입니다.
Jesús Carrera

1
문서에 게시 된 정규식은 본질적으로 올바르지 않습니다. 전체 식을 캡처하지 않은 그룹 (?:)으로 묶은 다음 주위에 앵커를 배치해야합니다. 여기서 실패를 참조 하십시오 . 자세한 내용 은 여기 내 답변을 참조하십시오 . ^(?:([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}))$수정 된 정규식입니다.
ctwheels

12

오래된 게시물이지만 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})$

이는 이전 버전에서는 없었던 새로운 런던 우편 번호 (예 : W1D 5LH)와 함께 작동합니다.


굵게 강조 표시된 오류가 문서에서 수정 된 것처럼 보이지만 읽기 쉬운 정규식을 선호합니다.
프로그래밍 교수 :

5
내가 말할 유일한 것은 공간을 \ 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-9][A-Za-z]{2}))$수정 된 정규식입니다.
ctwheels

10

이것은 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}

10

우편 번호는 변경 될 수 있으며 우편 번호를 확인하는 유일한 방법은 전체 우편 번호 목록을 가지고 있는지 확인하는 것입니다.

그러나 정규식은 다음과 같은 이유로 유용합니다.

  • 사용하고 구현하기 쉽다
  • 짧다
  • 빨리 달려
  • 유지 관리가 매우 쉽습니다 (전체 우편 번호 목록과 비교)
  • 여전히 대부분의 입력 오류를 잡습니다.

그러나 정규 표현식은 유지 관리가 어려운 경향이 있습니다. 따라서 다음과 같아야합니다.

  • 이해하기 쉬운
  • 상대적으로 미래의 증거

이것은이 답변의 정규 표현식이 충분하지 않다는 것을 의미합니다. 예를 들어 [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

나에게 이것은 가능한 한 많은 검증과 동시에 미래 보장 및 쉬운 유지 보수 간의 올바른 균형입니다.


왜 당신이 투표를했는지 확실하지 않습니다-이것은 내가 던진 모든 유효한 우편 번호와 위의 많은 답변이 올바르게 처리되지 않는 공백으로 작동합니다. 누구든지 이유를 설명하고 싶습니까?
Jon

1
@Jon 또한 다른 문자가 시작 또는 끝에 추가 될 때도 일치 aSW1A 1AAasfg합니다 ( 예 : 저에게 적합합니다 (쉽게 고칠 수있는 것 같지만
공감

9

나는 마지막 날 영국 우편 번호 정규식을 찾고 있었고이 스레드에서 우연히 발견되었습니다. 위의 제안을 대부분 수행했지만 그중 어느 것도 나를 위해 일하지 않았으므로 내가 아는 한 1 월 13 일 현재 유효한 영국 우편 번호를 모두 캡처하는 내 정규식을 생각해 냈습니다 (최신 문헌에 따르면 로얄 메일).

정규식 및 간단한 우편 번호 확인 PHP 코드는 다음과 같습니다. 참고 :-소문자 또는 대문자의 우편 번호와 GIR 0AA 이상을 허용하지만 입력 된 우편 번호의 중간에 공간이있을 가능성을 처리 할 수 ​​있으며 테스트 전에 공간을 제거하기 위해 간단한 str_replace를 사용합니다. 정규식에 반대합니다. 그 이상의 불일치와 Royal Mail 자체는 심지어 그들의 문헌에서 언급하지도 않습니다 ( http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf 를 읽고 17 페이지부터 읽기 시작하십시오) !

참고 : Royal Mail의 자체 문헌 (위 링크)에는 3 번째와 4 번째 위치에 약간의 애매함이 있으며 이러한 문자가 문자 인 경우 예외가 있습니다. 나는 Royal Mail에 직접 연락하여 그 내용을 명확하게 정리했다. 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>";

    }

?>

나는이 스레드를 우연히 발견하여 해결책을 찾는 다른 사람들을 돕기를 바랍니다.


1
어떤 예제 우편 번호가 게시 된 우편 번호에 실패했는지 알고 싶습니까?
Zhaph-벤 Duguid

특정 우편 번호를 제공 할 수는 없지만 (전체 PAF 목록에 액세스하지 않고) ANA NAA 형식의 우편 번호는 P 및 Q 문자가 세 번째 위치에 허용되고 AANA NAA 형식의 우편 번호가 잠재적으로 실패하므로 잠재적으로 실패합니다 또한 4 번째 위치가 모든 문자를 허용하므로 실패합니다 (위의 승인 된 답변에 제공된 정규식은 이들 중 하나를 설명하지 않습니다). 내가 말했듯이, 로얄 메일 (Royal Mail)의 현재 조언에 의해서만 가고 있습니다. 위의 답변을 받았을 때 정규 표현식이 완전히 준수했을 수 있습니다.
Dan Solo

감사합니다- "P"가 세 번째 위치 (링크 된 문서에서)에 허용되는 것으로 추가 된 것으로 보이지만 Q는 아닙니다. "4 번째 위치는 모든 문자를 허용합니다." 의사는 내가 볼 수있는 한 "제 4 순위"에 대해 전혀 언급하지 않았으므로 "실제 위치에 관계없이 세 번째 문자"라고 읽었습니다.
Zhaph-Ben Duguid

1
Royal Mail 지원 팀으로부터 답장을 받았으며 규칙에 대한 나의 해석은 분명히 맞습니다. 외부 규정의 네 번째 자리 (예 : AANA NAA)의 문자에는 예외가 없으며 세 번째 자리 예외는 마지막 문자 (예 : ANA NAA)에만 적용됩니다. 말의 입에서 곧장.
Dan Solo

1
이 정규식은 안쪽 코드 예 누락 유효한 우편 번호 상반기 진정한 일치를 반환합니다 @DanSolo SW1A또는 BD25(또는 적어도 나를 위해 한) 하반기없이
decvalts

7

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

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

그와 스펙의 유일한 차이점은 스펙에 따라 마지막 두 문자가 [CIKMOV]에있을 수 없다는 것입니다.

편집 : 여기에 후행 문자 제한을 테스트하는 다른 버전이 있습니다.

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

단지 받아들이보다 영국의 우편 번호에 대한 더 많은 복잡성이있다 A-Z- Q허용되지 않습니다는 V단지 문자의 위치에 따라 등, 드물게 사용된다.
Zhaph-벤 Duguid

2
원하는 것이 구문 검사라면 관련이 없습니다. 다른 많은 사람들이 언급했듯이 최신 데이터베이스의 조회 만 거의 정확하며 심지어 데이터베이스의 최신 상태에 문제가 있습니다. 그래서 저 에게이 구문 검사기 정규식은 명확하고 간단하며 유용합니다.
Rick-777

5

위의 정규 표현식 중 일부는 약간 제한적입니다. "K"가 허용되지 않으므로 위의 "위치 3-AEHMNPRTVXY 만 사용됨"규칙을 적용하면 "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})$

좀 더 정확 해 보이는 위키 백과 기사 '영국 우편 번호'를 참조하십시오 .

이 정규식에는 대문자 만 필요합니다.

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


우체국이 이전 한 것처럼 보이지만 정부는 다소 뒤쳐져 있습니다. (
Zhaph-Ben Duguid

4
"^ ([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}) $ "대문자와 소문자를 사용할 수 있고 공간을 선택적으로 만들 수 있기 때문에 마음에 들었습니다. 100 % 정확하지 않은 경우 유용성에 더 좋습니다!
bigtv

4

다음은 영국 우편 번호 문제를 처리 한 방법입니다.

^([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 문자 예상, 상한 또는 하한
  • 선택 가능한 공간
  • 1 개 숫자를 예상하다
  • 상한 또는 하한 2 az 예상

이것은 대부분의 형식을 얻은 다음 db를 사용하여 우편 번호가 실제로 실제인지 확인합니다.이 데이터는 오픈 포인트로 구동됩니다 https://www.ordnancesurvey.co.uk/opendatadownload/products.html

도움이 되었기를 바랍니다


이 형식 AANNA NAA은 유효하지 않습니다.
ctwheels

따라서 '이것은 대부분의 형식을 얻습니다'부분입니다. :)
Alex Stephens

4

기본 규칙 :

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

영국의 우편 번호 (또는 우편 번호)는 공백으로 구분 된 5 ~ 7 자의 영숫자로 구성됩니다. 특정 위치에 등장 할 수있는 캐릭터를 다루는 규칙은 다소 복잡하며 예외가 있습니다. 따라서 방금 표시된 정규식은 기본 규칙을 따릅니다.

완전한 규칙 :

가독성을 희생하면서 우편 번호 규칙에 대한 모든 상자를 표시하는 정규식이 필요한 경우 다음을 수행하십시오.

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

유효한 모든 영국 우편 번호에 대해 테스트 한 다음 정규식을 사용합니다. 권장 규칙을 기반으로하지만 합리적으로 압축되며 특별한 언어 별 정규식 규칙을 사용하지 않습니다.

([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"우편 번호는 제외되며 우편 번호의 공식 우체국 목록에없고 등록 된 주소로 사용되지 않는 한 유효하지 않습니다. 필요한 경우 특별한 경우로 추가하는 것이 간단합니다.


4

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

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

이를 통해 "L1 8JQ"와 같은 가장 짧은 우편 번호와 "OL14 5ET"와 같은 가장 긴 우편 번호를 사용할 수 있습니다.

최대 8자를 허용하므로 공백이없는 경우 "OL145ETX"의 잘못된 8 문자 우편 번호도 허용됩니다. 그러나 다시 말하지만, 이것은 충분한 정규 표현식입니다.


아 죄송합니다. 어제 테스트 할 때 / i를 놓친 것 같습니다.
John

3

우편 번호의 전반부 유효한 형식

  • [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를 제외하고
IJZ 미사용 위치 3-AEHMNPRTVXY 만 사용
위치 4-ABEHMNPRVWXY

우편 번호 후반

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

예외
위치 2 + 3-CIKMOV 사용되지 않음

가능한 모든 코드가 사용되는 것은 아니므로이 목록은 유효한 코드에 필요한 필수 조건은 아닙니다. 유효한 모든 코드 목록과 비교하는 것이 더 쉬울 수 있습니까?


3

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의 모든 우편 번호가 일치합니다.

?공백 뒤에 공백을 추가하고 대소 문자를 구분하지 않는 일치를 사용하여이 질문에 대답하십시오.

'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

유효성 검사에 실패한 다음 서버를 잘라내려면 양쪽에서 빈 공간과 탭을 허용합니다.

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

이것은 원래 질문에 설명 된 예제와 함께 c # (System.Text.RegularExpressions)을 사용하여 나를 위해 일한 유일한 패턴입니다
MattjeS

이것은 영국 정부의 깨진 정규식이며 유효한 형식 중 일부를 확인하지 못합니다.
ctwheels

@ctwheels 안녕하세요, 실패한 우편 번호를 제공해 주셔서 감사합니다.
Matas Vaitkevicius

예를 들어 AAA 1AA올바른 형식이 아닙니다 . 설명 및 수정에 대한 내 대답 을 참조하십시오 .
ctwheels

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

이 정규식은 대문자와 소문자 사이에 선택적인 공백이 있습니다.

소프트웨어 개발자의 관점에서이 정규식은 주소가 선택적 일 수있는 소프트웨어에 유용합니다. 예를 들어 사용자가 자신의 주소 정보를 제공하지 않으려는 경우


1

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

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

우편 번호 파싱을해야합니다. 요구 사항은 매우 간단합니다. 우편 번호를 아웃 코드 및 (선택 사항) 인 코드로 구문 분석해야합니다. 좋은 점은 유효성 검사를 수행 할 필요가 없다는 것입니다. 모호하게 지능적인 방식으로 제공된 내용을 잘라 내면됩니다. 형식, 즉 대소 문자 및 공백과 관련하여 가져 오기에 대해 많이 생각할 수 없습니다. 그러나 이것은 나쁜 소식이 아닙니다. 나쁜 소식은 RPG에서 모든 작업을 수행해야한다는 것입니다. :-(

그럼에도 불구하고, 나는 내 생각을 분명히하기 위해 작은 파이썬 함수를 함께 던졌습니다.

우편 번호를 처리하는 데 사용했습니다.


1

우리는 스펙을 받았다 :

영국 우편 번호는 다음 형식 중 하나 여야합니다 (한 가지 예외는 아래 참조). 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
여기서 A는 영문자를 나타내고 9는 숫자를 나타냅니다.
다음과 같은 추가 규칙이 알파벳 문자에 적용됩니다.
    § 1의 문자는 Q, V 또는 X가 아닐 수 있습니다
    § 2의 문자는 I, J 또는 Z가 아닐 수 있습니다
    § 3의 문자는 I, L, M, N, O, P, Q, R, V, X, Y 또는 Z가 아닐 수 있습니다
    § 4의 문자는 C, D, F, G, I, J, K, L, O, Q, S, T, U 또는 Z가 아닐 수 있습니다
    § 가장 오른쪽 두 위치의 문자는 C, I, K, M, O 또는 V가 아닐 수 있습니다
이러한 일반적인 규칙을 따르지 않는 한 가지 예외는 특별한 유효한 우편 번호 인 우편 번호 "GIR 0AA"입니다.

우리는 이것을 생각해 냈습니다.

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

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


2
안타깝게도 귀하의 솔루션은 A99A 9AA 우편 번호를 허용합니다.

1

영국 우편 번호 유효성 검사에 대한 정규식이 있습니다.

내부 또는 외부의 모든 유형의 우편 번호에서 작동합니다.

^((([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 ------------------> (외부 및 내부) POSTCODE의 조합

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


1

정규식에 오타가 있지만 허용 된 답변은 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

벌크 전송 PDF에서 거의 모든 변형과 정규식에서 발견 한 것은 위키피디아 사이트에있는 것은 이것입니다. 특히 위키피디아 정규 표현식의 경우 첫 번째 | (세로 막대) 뒤에 ^가 있어야합니다. 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})$

1

https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation 으로 확인하는 것뿐만 아니라 경험적 테스트 및 관찰을 통해 영국 우편 번호를 올바르게 구문 분석하고 유효성을 검사하는 Python 정규식 버전이 있습니다.

UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

이 정규식은 간단하며 캡처 그룹이 있습니다. 그것은 하지 않습니다 의 검증을 모두 포함하는 법적 영국의 우편 번호를, 만 계정으로 번호 위치 대 편지를합니다.

코드에서 사용하는 방법은 다음과 같습니다.

@dataclass
class UKPostcode:
    postcode_area: str
    district: str
    sector: int
    postcode: str

    # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
    # Original author of this regex: @jontsai
    # NOTE TO FUTURE DEVELOPER:
    # Verified through empirical testing and observation, as well as confirming with the Wiki article
    # If this regex fails to capture all valid UK postcodes, then I apologize, for I am only human.
    UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'

    @classmethod
    def from_postcode(cls, postcode):
        """Parses a string into a UKPostcode

        Returns a UKPostcode or None
        """
        m = re.match(cls.UK_POSTCODE_REGEX, postcode.replace(' ', ''))

        if m:
            uk_postcode = UKPostcode(
                postcode_area=m.group('postcode_area'),
                district=m.group('district'),
                sector=m.group('sector'),
                postcode=m.group('postcode')
            )
        else:
            uk_postcode = None

        return uk_postcode


def parse_uk_postcode(postcode):
    """Wrapper for UKPostcode.from_postcode
    """
    uk_postcode = UKPostcode.from_postcode(postcode)
    return uk_postcode

다음은 단위 테스트입니다.

@pytest.mark.parametrize(
    'postcode, expected', [
        # https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation
        (
            'EC1A1BB',
            UKPostcode(
                postcode_area='EC',
                district='1A',
                sector='1',
                postcode='BB'
            ),
        ),
        (
            'W1A0AX',
            UKPostcode(
                postcode_area='W',
                district='1A',
                sector='0',
                postcode='AX'
            ),
        ),
        (
            'M11AE',
            UKPostcode(
                postcode_area='M',
                district='1',
                sector='1',
                postcode='AE'
            ),
        ),
        (
            'B338TH',
            UKPostcode(
                postcode_area='B',
                district='33',
                sector='8',
                postcode='TH'
            )
        ),
        (
            'CR26XH',
            UKPostcode(
                postcode_area='CR',
                district='2',
                sector='6',
                postcode='XH'
            )
        ),
        (
            'DN551PT',
            UKPostcode(
                postcode_area='DN',
                district='55',
                sector='1',
                postcode='PT'
            )
        )
    ]
)
def test_parse_uk_postcode(postcode, expected):
    uk_postcode = parse_uk_postcode(postcode)
    assert(uk_postcode == expected)

0

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

아래 방법은 우편 번호를 확인하고 완전한 정보를 제공합니다

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!"}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.