2010-06-15 8 views
2

범위와 함께 유효 부분 및/또는 일련 번호를 조합하여 정규식을 구성하려고합니다.자바 스크립트 정규식 : 복잡한 입력 유효성 검사

유효 부분의 개수는 두 개의 알파, 세자리 패턴 또는/[아즈] {2} \의 D {3}/

i.e. aa123 or ZZ443 etc... 

유효한 일련 번호가 다섯 자리수 패턴 또는/\ d {5}/

13245 or 31234 and so on. 

그 부분은 문제가되지 않습니다. 조합과 범위도 유효해야합니다.

12345, ab123,ab234-ab245, 12346 - 12349 - 궁극적 인 목표입니다. 범위 및/또는 일련 번호 부품 및/또는 일련 번호를 임의로 조합하여 사용할 수 있습니다. 공백은 범위를 지정할 때 또는 일련의 쉼표 뒤에 지정할 때 선택 사항입니다.

내가 지금이 일이 표현 레슬링되었고, 피난처 '- (AB 239 즉 AB 123에게) 부품 번호의 범위는 범위의 양쪽에 같은 두 개의 문자 조합을 가지고 있습니다 t이보다 더 나은 아무것도 가지고 올 :

/^(?:[A-z]{2}\d{3}[, ]*)|(?:\d{5}[, ]*)|(?:([A-z]{2})\d{3} ?- ?\4\d{3}[, ]*)|(?:\d{5} ?- ?\d{5}[, ]*)$/ 

...

내 정규식 - 푸 약하다.

+0

하이픈의 양쪽에있는 두 글자 조합이 같은 경우 정규식으로 확인할 수 있다고 생각하지 않지만 정규식 전문가는 아닙니다. –

+0

나는 일치하는 범위가 정규 표현식에서 가능하다고 생각하지 않는다. 예를 들어, regex에서 IP 주소의 유효성을 검사하는 코드를 찾으십시오. 나는 작동하지 않는 솔루션을 보지 못했다. (255보다 작은 숫자를 검사하는 것은 불가능한 것 같다.) – Shawn

답변

1

먼저 [A-z]이 잘못되었습니다. 글자 외에도 대괄호, 백 슬래시, 캐럿, 밑줄 또는 백틱과 일치합니다. ASCII 문자 집합에서 대문자와 소문자 사이에있는 모든 문자입니다. 대/소문자를 구분하지 않는 옵션을 사용하여 [A-Za-z] 또는 [A-Z]을 사용해야합니다.

가 하나의 일련 번호 또는 일련 번호의 범위 중 하나와 일치하려면 다음을 수행하십시오

/\d{5}(?:\s*-\s*\d{5})?/ 

... 그리고 부품 번호 :

/([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?/i 

당신의 정규식에서 당신이 \4을 사용 ,하지만 그건 잘못되었습니다. 첫 번째 부품 번호의 문자와 일치하는 네 번째 그룹 일 수 있지만 을 사용 했으므로 첫 번째 부품 번호는 이고 첫 번째 부품 번호는입니다.

전체 시리즈에 맞게 함께 씌우고, 당신은

/(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+/i 

쉼표는 선택 사양하는이,하지만 정규식 잘못 1234512345 또는 12345ab123 같은 순서를 일치 수 있음을 의미합니다. 그런 일이 일어날 것 같지는 않지만, 나는 그것을 덮기 위해 단어 경계 (\b)를 추가했다.두 개의 일련 번호/부품 번호/범위 사이에 적어도 하나의 단어가 아닌 문자가 있어야하며 (?:,\s*)?은 쉼표와 선택적 공백 만 허용 할 수 있음을 의미합니다. [, ]*은 공백 및/또는 쉼표를 허용하거나 전혀 허용하지 않습니다.

+0

환상적! 처음에 나는 그룹을 캡쳐하지 않고, 나중에 역 참조를 \ 1로 바꾸는 것을 잊었다. 나는 당신이 여기에서 생각하는 방식을 정말로 좋아합니다. 부품/시리얼을 파트/시리얼/파트 범위/시리얼 범위 경로가 아닌 옵션 범위와 매칭시키는 것이 좋습니다. +2에서 Awesomeness. –

+0

나는 그것이 정상적으로 작동하게하려면 문자열의 시작과 끝을 정규 표현식에 추가해야했지만 여전히 멋지다. 다시 한번 감사드립니다. –

1

정규식을 사용하여이 작업을 수행하지 않을 수도 있습니다. 당신은 단지 선택적 범위입니다 부품/일련 번호, 쉼표로 구분 된 목록이있는 경우,이 쉬울 수 있습니다 : 모든 통과하면

split input on commas 
for each input: 
    if there is a dash: 
     split on a dash, strip each element to remove whitespace 
     make sure each side is a part or a serial number (can use 2 regexes here) 
     if they're part numbers, make sure they start w/ the same two letters 
    else: 
     strip to remove whitespace, make sure is a valid part or serial number 

는 다음 입력이 정확합니다.

+0

hm ... 확실히 옵션. –

+1

자바 스크립트는 문자열 분할을 할 수 있으므로 너무 나쁘지 않아야합니다. 또한 코드가 더 읽기 쉽고 어떤 이유로 든 요구 사항이 변경되면 정규식보다 코드를 수정하는 것이 쉬워야합니다. – Claudiu

관련 문제