2011-11-16 5 views
1

텍스트 항목의 유효성을 검사하기 위해 정규식을 작성해야합니다. 텍스트는 5 자 이상 16 자 이하 여야합니다 (a-Z + 하이픈, 밑줄 및 공백). 이것은 괜찮지 만 연속적인 공백이 없는지 확인해야합니다.중복 된 공백 문자를 확인하는 정규식

("는 정규식의 일부가 아닌) 내가

" |[^\\p{L}_ -]" 

와 함께 갈 것입니다 자바에서

/^(?!.* )[-a-z_ ]{5,16}\z/i 
+3

연속적인 하이픈과 연속적인 밑줄은 어떨까요? 'hello- _there'와 같은 두 종류 이상의 실행은 어떨까요? 문자열의 처음이나 끝에있는 공백, 하이픈 또는 밑줄은 어떻게됩니까? –

+0

@Alan - 문자열의 아무 곳이나 연속 된 공백 –

답변

4

당신은 같은 것을 사용할 수 있습니다. 문자열이이 정규식과 일치하면 실패합니다. if 문장에서 크기를 별도로 확인할 것입니다 (그렇게 빨리).

유니 코드 속성없이 어떤 언어로 그것을하고 싶은 경우 :

\s\s|[^A-Za-z_ -] 
+0

감사하지만이 예제를 테스트 할 때 어떤 유효성도 검사하지 않습니다. 나는 또한 그것을 http://www.regexplanet.com/simple/index.html에서 테스트했으며, 거기에서도 실패한다. 어떤 아이디어? –

+1

@ TheFlowerGuy, 구분 기호 및 플래그없이 시도하십시오 :'^ (?!. *) [- a - z_] {5,16} \ z' 또는'^ (?!. *) [- a - z_] {5 , 16} $' –

+1

그럼 Java로 작업하고 있습니까? 그것이 RegexPlanet이 사용하는 것입니다. 질문에 사용하는 언어/향미료로 태그를 지정하십시오. –

1

:

hello  // PASS 
hello there // PASS 
hi there you // PASS 
hello there // FAIL - two spaces between hello and there 
+0

내가했던 것처럼 블록 스타일의 서식을 사용하면 공백이 보존됩니다. 또한이 정규식은'matches()'가 아닌'find()'메소드와 함께 적용되어야한다고 언급해야합니다. –

+0

팁 주셔서 감사합니다. 이 솔루션은 위의 솔루션보다 훨씬 빠릅니다. 이 솔루션은 최상의 경우 시나리오에서 한 문자 (시작 또는 2 공백에서 잘못된 문자)와 최악의 시나리오 (정확한 문자열)의 모든 문자를 검사합니다. Negative Lookahead (?!. *)가있는 솔루션 (위의 경우)은 항상 모든 문자를 확인하고 (최하위 시나리오 - 끝에 두 개의 공백) 모든 문자를 두 번 검사합니다 (최악의 시나리오 - 올바른 문자열 또는 스타트). –

0

정규식 :

^([\w-_]+([\s]{0,1})[\w-_]+)$ 

hello 
hello there 
hi there 
he-llo 
he_las test 

그리고 일치하지

,
hello there 
hello  there 
+0

'hi there you'와 일치하지 않습니다; '123 456'에 잘못 일치합니다; 탭, 줄 바꿈 및 기타 공백 문자를 허용합니다. 길이를 확인하지 않습니다. 또한 공간을 선택적으로 만드는 대신 다음 부분으로 그룹화하고 그룹을 선택적으로 만들어야합니다 :'^ (? =. {5,16} $) [A-Za-z _-] + (?: [A -Za-z _-] +) * $' –

관련 문제