2017-10-28 2 views
0

정규식 패턴 supplied by the British government을 사용하여 영국 우편 번호를 확인합니다.전체 문자열과 정규식 일치

const postcodeRegex = /^([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})$/g; 

console.log(postcodeRegex.test('s75ed')); // returns true 
console.log(postcodeRegex.test('s75ed555555')); // returns false 
console.log(postcodeRegex.test('555555s75ed')); // returns true 

첫 번째 2 개 콘솔 로그가 올바른지,하지만 난 3가 false를 반환 할 것으로 예상 : 내 테스트는 현재 다음과 같습니다. 이 테스트는 패턴이 문자열 끝에 매치 될 때 true를 반환하지만, 문자열의 시작 부분에 모든 지껄 거리는 소리를 허용합니다. 이는 전체 문자열이 유효하지 않은 우편 번호임을 의미합니다.

패턴을 전체 문자열과 정확히 일치 시키려면 어떻게해야합니까? 우리는 약간의 공백 들여 쓰기를 추가하는 경우

+0

은 영국 정부에서 직접 복사이 패턴인가 : 당신이 i 플래그를 추가하고 사례 중 하나를 제거한다면 당신은 꽤 비트에 의해 단순화 할 수 있을까? 그렇다면 제대로 테스트하지 않은 것이 놀랍습니다. o) – agrm

+0

@agrm 예 .gov 웹 사이트에 게시 된 문서에서 직접. 믿기지가 않지만 정부가하는 일입니다. – Coop

+0

@agrm PDF에 대한 링크를 추가했습니다. – melpomene

답변

3

귀하의 정규식이 형태를 갖는다. 이것은 AgibberishgibberishB과 일치 할 것으로 예상하지 않았지만 실제로는 ^(A|B)$을 찾고 있습니다. 이렇게 쓰여진 은 A 또는 B, 과 일치하지 않으므로 AgibberishgibberishB과 일치하지 않습니다.

Btw 정규 표현식의이 부분은 버그 모양입니다 ([AZa-z]). 아마 [A-Za-z]을 의미했을 것입니다.

실제로 정규 표현식의 모든 알파벳 문자는 대소 문자 형식으로 나타납니다.

const postcodeRegex = /^((gir 0a{2})|((([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}))$/gi; 
+0

위대한, 이것은 내가 생각했던 것보다 더 많은 문제를 해결합니다. 정부가이를 위해 잘못된 패턴을 제공하도록 믿으십시오. – Coop

+0

심지어 수정 된 정규 표현식이 우편 번호의 유효성을 완전히 검사하지 않습니다. Q와 같은 일부 문자는 첫 번째 위치에 나타날 수 없습니다. 나는 결코 사용되지 않는다. 특정 조합 만 유효합니다. 첫 번째 위치에있는 지구 G는 괜찮습니다. 그러나 GL, GU 및 GY 만 보조 문자로 유효합니다. 등등. – Nick

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

, 즉 첫 번째 대안 만 문자열의 시작 부분에 고정되고 (^) 두 번째 대안 만 문자열 끝에 고정됩니다 ($).

당신은 대신에 (비 캡처) 그룹의 전체를 포장 할 수 있습니다 ^A|B$ :

^(?:...|...)$ 
+1

브릴리언트, 새로운 그룹이 문제를 해결하는 것 같습니다. 나는 영국 정부가 이것을 위해 잘못된 정규식 패턴을 공개적으로 공유하는 것에 놀랐다 ... 잠깐, 나는별로 놀랍지 않다. – Coop