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

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

성냥

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

일치하지 않습니다

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

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



답변

우편 번호에 대한 영국 정부 데이터 표준을 살펴 보는 것이 좋습니다. [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를 시작하는 우편 번호)를 허용하며 시도 할 수있는보다 엄격한 테스트를 제공합니다.


답변

우리가 사용할 것 같습니다 ^(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를 제외한 모든 문자가 될 수 있습니다.

최고의 소원

콜린


답변

최근 에이 질문에 대한 답변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$


답변

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

우편 번호는 임의로 복잡하고 끊임없이 변경됩니다. 예를 들어, 아웃 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 및 일치하는 회사 사이의 협력으로 모든 영국 주소에 대한 모든 정보의 확실한 디렉토리를 만듭니다 (그들은 상당히 성공적이었습니다). 유료이지만 지역 당국, 정부 부서 또는 정부 서비스와 함께 작업하는 경우 무료로 사용할 수 있습니다. 우편 번호 만 포함 된 것보다 더 많은 정보가 있습니다.


답변

위의 답변 중 일부를 살펴본 결과 @ 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

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


답변

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


답변

이 위키 백과 표에 따르면

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

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

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