2011-03-07 3 views
0

여러 줄 입력란에서 입력을 확인하기 위해 asp.net RegularExpressionValidator을 사용하고 있습니다. 나는 그것을 가지고 있지만 나는 뭔가를 놓치고 있어야합니다. "(([0-9]{1,2})(,|\s|-)?)*"하고 그것이 유효 말하는 111하지만 모든 작동 :숫자 범위와 일치하는 정규식을 작성하는 방법은 무엇입니까?

1 => valid 

1-10 => valid 

1-10,45,50 => valid 

1 10 45 50 => valid 

111 => INVALID 

그러나, 111 여기

내가 사용하고있는 정규식 다시 유효한오고있다 : 이것은 어떻게해야입니다. 나는 그것이 그것이 유효하다고 생각하는 이유를 안다, 나는 단지 그것을 무효로 만드는 방법을 모른다.

+1

무엇을 확인 하시겠습니까? 3 자리 숫자 또는 '111'입니까? – Augusto

+1

그래, 여기 규칙은 뭐니? –

+0

규칙은 숫자 또는 대시 또는 공백이있는 숫자를 입력 할 수 있지만 대시 또는 공백은 하나만 입력 할 수 있으며 글자 및 숫자는 2 자리를 초과 할 수 없습니다. –

답변

3

, 당신이 대신 할, (111)과 일치하므로 같은 수 아무것도 번호와 일치 할 것이다 옵션의 부 구분자를하지 마십시오 :

"[0-9]{1,2}([-,\s][0-9]{1,2})*" 

편집 : 명확성을 위해을 다음과 같은 경우 정규식 엔진이 전체 문자열과 일치하지 않으면 시작 부분에 ^을 추가하고 정규 표현식 끝에는 $을 추가해야합니다.

+0

이것은 완벽합니다. 고마워요! –

+0

realy? [rubular] (http://www.rubular.com/)에 따르면 111과 일치합니다. 앵커 '\ b'가 필요하다고 생각합니다. 내 대답은 아래를 참조하십시오. – stema

+1

@stema, 이것은 좋은 대답입니다. 왜냐하면 그는/^ ([0-9] {1,2} ([-, \ s] [0-9] { 1,2}) *) $ /'잘 작동해야합니다. – sln

0

귀하의 정규식은 "111"에서 "11"과 반복 패턴이 0 번 일치합니다. 당신이^... 당신의 정규식을 포장하는 경우 $ 그것을 작동합니다 :

^(([0-9]{1,2})(,[\s-])?)*$ 

을 다음 정규식 문자열에 추가 문자를 허용하지 것이기 때문에.

+0

아니요, 111과 일치하는 nullable seperator이므로 111과 여전히 일치합니다. – markijbema

+0

RegularExpressionValidator는 암시 적으로이를 이미 추가합니다. –

0

[0-9]{1,2} 용어 뒤에 다음 문자가 숫자가 아닌지 확인하기 위해 부정적 미리보기가 필요합니다. asp.net에 익숙하지 않지만, [0-9]{1,2}(?![0-9])과 같은 것이 더 나은 결과를 가져올 수 있습니다. Lookahead에 대한 자세한 내용은 this page을 참조하십시오.

편집 : 위의 정규식은 도움이되지만 여전히 111의 마지막 두 자리와 일치합니다. 다음 정규식 (online regex tester을 사용하여 검증 됨)이 작동해야합니다. 처음에 단어 경계 앵커를 추가하여 표현식이 숫자 중간에서 일치를 시작하지 못하게해야합니다. 또한 선택 사항 대신 분리 문자를 필수로 만듭니다. 이 조합은 미리보기의 필요성을 제거합니다.

(\b([0-9]{1,2})(-|,|\s|$))+ 
+0

이것은 모두 일치합니다 – sln

+0

@ sln- 내가 사용했던 정규 표현식 테스터는 Javascript의 정규식 엔진에 의해 구동되며 asp.net 엔진은 약간 다르게 설계되었다고 가정합니다. – bta

+0

'(무엇이든) *'는 적용될 때마다 빈 문자열과 일치 할 수 있기 때문에 항상 성공적인 일치를보고합니다. 그것은 내가 아는 모든 정규식의 풍미에 사실입니다. –

0

왼쪽 고정 패턴은 ^입니다. *은 욕심이 많으며 두 번째와 세 번째의 1111입니다.

0

일을 좀 더 단순하게 만들려면 여러 정규식 검사로 나누십시오.

문자열이 (([0-9]{1,2})(,|\s|-)?)*과 일치하면 문자열이 \d{3,}과 일치하는지 확인하십시오. 그럴 경우, 그다음에 실패합니다.

+0

'(([0-9] {1,2}) (, | \ s | -)?) *''을 모두 검증하고 싶다면, – sln

0

구분 기호가 필요하다고 생각합니다. '?' 0 또는 하나의 인스턴스를 허용합니다.

0

두 가지 문제가 있다고 생각합니다. 한 가지 문제는 사용자가 입력 한 각 문자에 대해 유효성을 검사하는 정규식입니다. 나중에 데이터를 추출 할 또 다른 정규식.

입력 된 각 문자에 대해 유효성을 검사하는 정규식을 사용하려면 시작 앵커, 원하지 않는 문자가 들어올 수도 있지만 끝 앵커가 시작보다 중요합니다.그래서 rubular.com에

이 특정 정규식 [-]을 허용 규칙

  1. 를 사용하여 문자없이 연속으로 2 개 이상의 자리
  2. commma 또는 공간이나 대시가 아닌 이상 2보다 연속적으로

결국 데이터 추출이 달라 지므로이 방법은 사용자가 입력 한 문자별로 작동합니다.

변형까지 시도한 모든 작업을 처리했습니다.

^(?:\b\d{1,2}(?:([, -])(?!\1)[, -]?|))+$

\b는 3 열 자리 distinquish 위해 실제로 필요한 것이다.
사용해보기.

관련 문제