입력 문자열 내에서만 전체 복잡한 영국 우편 번호의 유효성을 검사하는 정규 표현식을 따릅니다. 일반적이지 않은 모든 드문 우편 번호 양식이 포함되어야합니다. 예를 들어 :
성냥
- 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를 시작하는 우편 번호)를 허용하며 시도 할 수있는보다 엄격한 테스트를 제공합니다.
^([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|[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}))$
이것은 해외 영토를 다루지 않으며 다른 지역의 존재가 아닌 형식 만 시행합니다. 다음 규칙을 기반으로합니다.
다음 형식을 사용할 수 있습니다.
어디:
최고의 소원
콜린
^(([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}))$
{0,}
대신 지정 해야하는 이유는 무엇 *
입니까?
최근 에이 질문에 대한 답변 을 R 언어의 영국 우편 번호 에 게시 했습니다 . 영국 정부의 정규식 패턴이 잘못되어 제대로 작동 하지 않음을 발견했습니다 . 일부 우편 번호의 유효성 검사 . 불행히도, 여기의 많은 답변은이 잘못된 패턴을 기반으로합니다.
아래에서 이러한 문제 중 일부를 간략하게 설명하고 실제로 작동 하는 수정 된 정규식을 제공 합니다.
내 대답 (및 일반적인 정규 표현식) :
잘못된 정규식에 신경 쓰지 않고 답변으로 건너 뛰려면 답변 섹션으로 스크롤 하십시오.
이 섹션의 정규식은 사용하지 않아야합니다.
이것은 영국 정부가 개발자들에게 제공 한 정규 표현식입니다 (이 링크의 길이는 확실하지 않지만 대량 데이터 전송 문서 에서 볼 수 있습니다 ).
^([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})$
대부분의 개발자가 할 첫 번째 일은 두 번 생각하지 않고 개행을 지우는 것입니다. 이제 정규 표현식은 공백이있는 우편 번호와 일치하지 않습니다 (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})$
^
^([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}))$
^^ ^^
^([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
.
이 문제를 해결하려면 문자 -
를 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})$
^
^([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})$
^
이 정규식의 성능은 매우 나쁩니다. 우선, 그들은 가장 가능성이 적은 패턴 옵션을 GIR 0AA
처음에 맞췄습니다. 이 우편 번호와 다른 우편 번호를 가진 사용자 수는 몇 명입니까? 아마 절대? 이것은 정규식을 사용할 때마다 다음 옵션으로 진행하기 전에이 옵션을 먼저 소모해야 함을 의미합니다. 성능에 미치는 영향을 보려면 옵션을 뒤집은 후 원래 정규식 이 동일한 정규식 에 대해 수행 한 단계 수 (35)를 확인하십시오 (22).
성능의 두 번째 문제는 전체 정규식이 구성되는 방식 때문입니다. 각 옵션에 실패하면 역 추적 할 수 없습니다. 현재 정규식이 구성되는 방식을 크게 단순화 할 수 있습니다. 답변 섹션 에서 이에 대한 수정 사항을 제공합니다 .
이것은 그 자체로 는 문제 로 간주되지 않을 수도 있지만 대부분의 개발자들에게는 우려를 불러 일으 킵니다. 정규식의 공백은 선택 사항이 아닙니다. 즉, 우편 번호를 입력하는 사용자는 우편 번호에 공백을 두어야합니다. ?
공백 다음에 공백을 추가 하여 선택적으로 렌더링 하면 쉽게 해결할 수 있습니다. 수정 사항 은 응답 섹션을 참조하십시오 .
문제점 섹션에 요약 된 모든 문제를 수정 하고 패턴을 단순화하면 다음과 같이 짧고 간결한 패턴이 생성됩니다. 우편 번호를 전체적으로 (개별 부분이 아닌) 검증하기 때문에 대부분의 그룹을 제거 할 수도 있습니다.
^([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})$
특정 알파벳 문자를 보장하지 않고 다음을 사용할 수 있습니다 ( 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.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)$
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)$
최근 영국 우편 번호 시스템 BF#
(여기서 #
숫자를 나타냄) 에 더 잘 맞도록 변경되었지만 선택적 우편 번호로 간주됩니다 . 이 우편 번호는 형식을 BFPO
따르고 (1-4 자리)입니다.
^BFPO ?\d{1,4}$
산타에는 또 다른 특별한 경우가 있습니다 (다른 답변에서 언급했듯이). 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 사용되지 않음
0-9
,로 시작하는 우편 번호를 가질 수 있다고 제안합니다.
이 위키 백과 표에 따르면
이 패턴은 모든 경우를 다룹니다
(?:[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
여기에있는 대부분의 답변은 데이터베이스에있는 모든 우편 번호에서 작동하지 않았습니다. 나는 마침내 정부가 제공 한 새로운 정규식을 사용하여 모두와 함께 유효한 것을 발견했습니다.
이전 답변에 포함되어 있지 않으므로 링크가 다운되는 경우 여기에 게시하십시오.
^([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) 플레이버와 작동하는 것에 대한 그의 의견을 참조하십시오.
^([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})$
- 차이 ;-) 자리
([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 하나 개 이상의 결과를 찾을 수 모두를위한 공간 구분자가없는 결과를 찾을 수 있습니다.
(?:)
으로 묶은 다음 주위에 앵커를 배치해야합니다. 여기서 실패를 참조 하십시오 . 자세한 내용 은 여기 내 답변을 참조하십시오 . ^(?:([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}))$
수정 된 정규식입니다.
오래된 게시물이지만 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})$
에서:
이 문서는 또한 그 배후의 논리를 설명합니다. 그러나 오류 (굵은 글씨)가 있으며 소문자가 허용됩니다. 법률은 일반적이지 않지만 수정 된 버전입니다.
^(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)와 함께 작동합니다.
(?:)
으로 묶은 다음 주위에 앵커를 배치해야합니다. 여기서 실패를 참조 하십시오 . 자세한 내용 은 여기 내 답변을 참조하십시오 . ^(?:([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}))$
수정 된 정규식입니다.
이것은 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
나에게 이것은 가능한 한 많은 검증과 동시에 미래 보장 및 쉬운 유지 보수 간의 올바른 균형입니다.
aSW1A 1AAasfg
합니다 ( 예 : 저에게 적합합니다 (쉽게 고칠 수있는 것 같지만
나는 마지막 날 영국 우편 번호 정규식을 찾고 있었고이 스레드에서 우연히 발견되었습니다. 위의 제안을 대부분 수행했지만 그중 어느 것도 나를 위해 일하지 않았으므로 내가 아는 한 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>";
}
?>
나는이 스레드를 우연히 발견하여 해결책을 찾는 다른 사람들을 돕기를 바랍니다.
SW1A
또는 BD25
(또는 적어도 나를 위해 한) 하반기없이
다음은 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
단지 문자의 위치에 따라 등, 드물게 사용된다.
위의 정규 표현식 중 일부는 약간 제한적입니다. "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가 아니라면 가치가 없을 것입니다.
다음은 영국 우편 번호 문제를 처리 한 방법입니다.
^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$
설명:
이것은 대부분의 형식을 얻은 다음 db를 사용하여 우편 번호가 실제로 실제인지 확인합니다.이 데이터는 오픈 포인트로 구동됩니다 https://www.ordnancesurvey.co.uk/opendatadownload/products.html
도움이 되었기를 바랍니다
AANNA NAA
은 유효하지 않습니다.
기본 규칙 :
^[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)$
고객 데이터베이스에 대해 테스트되었으며 완벽하게 정확 해 보입니다.
유효한 모든 영국 우편 번호에 대해 테스트 한 다음 정규식을 사용합니다. 권장 규칙을 기반으로하지만 합리적으로 압축되며 특별한 언어 별 정규식 규칙을 사용하지 않습니다.
([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"우편 번호는 제외되며 우편 번호의 공식 우체국 목록에없고 등록 된 주소로 사용되지 않는 한 유효하지 않습니다. 필요한 경우 특별한 경우로 추가하는 것이 간단합니다.
나는 너무 많은 것을 허용하는 것이 좋지만 유효한 우편 번호를 거부하지 않는 간단한 정규식을 원했습니다. 나는 이것과 함께 갔다 (입력은 제거되거나 잘린 문자열이다) :
/^([a-z0-9]\s*){5,8}$/i
이를 통해 "L1 8JQ"와 같은 가장 짧은 우편 번호와 "OL14 5ET"와 같은 가장 긴 우편 번호를 사용할 수 있습니다.
최대 8자를 허용하므로 공백이없는 경우 "OL145ETX"의 잘못된 8 문자 우편 번호도 허용됩니다. 그러나 다시 말하지만, 이것은 충분한 정규 표현식입니다.
우편 번호의 전반부 유효한 형식
예외
위치 1-QVX 미사용
위치 2-GIR 0AA를 제외하고
IJZ 미사용 위치 3-AEHMNPRTVXY 만 사용
위치 4-ABEHMNPRVWXY
우편 번호 후반
예외
위치 2 + 3-CIKMOV 사용되지 않음
가능한 모든 코드가 사용되는 것은 아니므로이 목록은 유효한 코드에 필요한 필수 조건은 아닙니다. 유효한 모든 코드 목록과 비교하는 것이 더 쉬울 수 있습니까?
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" ]
유효성 검사에 실패한 다음 서버를 잘라내려면 양쪽에서 빈 공간과 탭을 허용합니다.
^\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*$)
이 목록에 추가하려면 사용자가 입력 할 수있는보다 실용적인 정규 표현식을 사용하십시오 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}))$
이 정규식은 대문자와 소문자 사이에 선택적인 공백이 있습니다.
소프트웨어 개발자의 관점에서이 정규식은 주소가 선택적 일 수있는 소프트웨어에 유용합니다. 예를 들어 사용자가 자신의 주소 정보를 제공하지 않으려는 경우
이 페이지의 파이썬 코드를 살펴보십시오.
http://www.brunningonline.net/simon/blog/archives/001292.html
우편 번호 파싱을해야합니다. 요구 사항은 매우 간단합니다. 우편 번호를 아웃 코드 및 (선택 사항) 인 코드로 구문 분석해야합니다. 좋은 점은 유효성 검사를 수행 할 필요가 없다는 것입니다. 모호하게 지능적인 방식으로 제공된 내용을 잘라 내면됩니다. 형식, 즉 대소 문자 및 공백과 관련하여 가져 오기에 대해 많이 생각할 수 없습니다. 그러나 이것은 나쁜 소식이 아닙니다. 나쁜 소식은 RPG에서 모든 작업을 수행해야한다는 것입니다. :-(
그럼에도 불구하고, 나는 내 생각을 분명히하기 위해 작은 파이썬 함수를 함께 던졌습니다.
우편 번호를 처리하는 데 사용했습니다.
우리는 스펙을 받았다 :
영국 우편 번호는 다음 형식 중 하나 여야합니다 (한 가지 예외는 아래 참조). § 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
그러나 참고-이것은 그룹 사이에 많은 수의 공백을 허용합니다.
영국 우편 번호 유효성 검사에 대한 정규식이 있습니다.
내부 또는 외부의 모든 유형의 우편 번호에서 작동합니다.
^((([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 --------------------> 외부
정규식에 오타가 있지만 허용 된 답변은 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})
또한 첫 번째 블록과 두 번째 블록 사이의 선택적 공간도 포함합니다.
벌크 전송 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})$
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)
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!"}