2012-03-30 9 views
0

나는 1980 년 이전의 VIN (차량 식별 번호)을 잡을 RegEx를 사용하려고합니다. Anythign pre 1980 년대는 17 자리가 될 필요가 없으며 'O 's and'U '를 포함 할 수 있습니다. 여기VIN RegEx Pre 1980

http://lamptricks.blogspot.com/2012/03/vin-regex-pre-1980-and-new.html이 정규식입니다 : ^((([a-h,A-H,j-n,J-N,p-z,P-Z,0-9]{9})([a-h,A-H,j-n,J-N,p,P,r-t,R-T,v-z,V-Z,0-9])([a-h,A-H,j-n,J-N,p-z,P-Z,0-9])(\d{6}))|(([a-h,A-H,j-z,J-Z,0-9]{6,11})(\d{5})))$

그러나 다음 VIN 테스트 통과하지 못한 : BCG23253

이 사이트는 (그것은 또한 VIN 규칙을 설명합니다) 그것을 위해 정규식을 주장

끝나고 5 자리이며 길이는 8 자입니다.이 RegEx 계정은 ... VIN에 결함이 있습니까, 아니면 RegEx입니까? 정규식 읽기 어렵다는

+1

오래된 VIN은 11-16 자 여야합니다. 길이 8은 유효하지 않은 것으로 보입니다. 이 부분을 보라.'(([a-h, A-H, j-z, J-Z, 0-9] {6,11}) (\ d {5})'5 자리 전에 6-11자를 필요로한다. – Wiseguy

+0

@Wiseguy 좋은 지적은 아마도 나쁜 데이터입니다. – mint

+0

참고로, 나는 가독성을 위해 중복 된 문자 범위 (소문자 용, 대문자 용, 하나 또는 둘 다 유지)를 제거하고 대/소문자를 구분하지 않지만 정규식 엔진에서는 옵션을 사용합니다. – Wiseguy

답변

2

우선, 찾은 정규 표현식에는 약간의 작업이 필요합니다. 필자는 저자가 문자 클래스 안에서 쉼표가 무엇을 의미하는지 이해하지 못한다고 생각한다.

/^((?!.{9}[su])[a-z0-9-[io]]{11}\d{6}|[a-hj-z0-9]{6,11}\d{5})$/i 

말했다되고 그건 : 당신의 정규식 엔진에 따라, 더 후

/^([a-hj-mp-z0-9]{9}[a-hj-mp-rtv-z0-9][a-hj-mp-z0-9]\d{6}|[a-hj-z0-9]{6,11}\d{5})$/i 

... 그리고 : 당신이 불필요한 쉼표 및 캡처 그룹을 무시하면,이에 대한 모든 일을 단순화 할 수 있습니다 , 당신이 준 숫자 (BCG23253)는 길이가 8 문자이기 때문에 요구 사항을 만족하지 못합니다. 최소 요구 사항 (위의 [a-hj-z0-9]{6-11}\d{5} 부분)을 충족 시키려면 입력 내용이 11-17 자이고 5 자리 숫자로 끝나야하며 문자는 I이 아니어야합니다.

따라서 BCG23253은 통과하지 말아야하지만 BCGBCG23253 (예 :)입니다. 위의 제 의견에서 말했듯이, 당신이 찾고있는 특정 경기에 대해 더 많은 정보가 필요하다고 생각합니다. 그것은 당신이 게시 한 정규 표현식이 -1980 VIN 이전의 1980 VIN이 아닌 일치에 대해 만들어진 것처럼 들립니다. 어느 쪽이든, 또는 BCG23253은 결국 유효한 VIN이 아닙니다.

+0

오타를 지적하기 위해 @WillDelGenio에게 감사드립니다. –

2

하지만 운영자 또는 후에이 보면 :

(([a-h,A-H,j-z,J-Z,0-9]{6,11})(\d{5})))$ 

말한다 ... "6 내지 선행 기 (11)를 5 자리 하였다." 샘플 VIN이 해당 기준을 충족하지 않습니다.

+1

대괄호 사이에 쉼표를 제거하려고합니다. 문자 쉼표와 반복적으로 일치합니다. (나는 이것을 편집으로 제출하려고 시도했지만, Stackoverflow 소프트웨어는 6 자 미만으로 변경 되었기 때문에 그것을 거절했다! 어쨌든, 당신 자신을 편집 할 수있다.) – thb

+0

@thb op의 RegEx의 직접 복사/붙여 넣기이다. 쉼표가 아닌 문제는 샘플 VIN이 유효하지 않다는 것입니다. – Madbreaks

+1

@Madbreaks 쉼표로는 오류가 발생하지 않지만 허용되지 않아야하는 문자는 허용됩니다. 그것들은 필요도없고 바람직하지도 않다. – Wiseguy