2014-12-09 2 views
0

자바 정규 표현식에서 공백을 나타내는 것에 관한 작은 쿼리가 있습니다.정규식 공백에 대하여

나는 이름을 제한하려는 그 동안 나는

Pattern DISPLAY_NAME_PATTERN = compile("^[a-zA-Z0-9_\\.!~*()=+$,-\s]{3,20}$"); 

하지만 일식 오류로 표시하는 등의 패턴을 정의 "잘못된 이스케이프 시퀀스".IT가에 따라 "\ s의"그것을 말하는

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

는 유효한 미리 정의 된 클래스입니다.

실종 됐습니다. 누구든지 도와 줄 수 있습니까?

미리 감사드립니다.

+0

그때 내가 스레드의 예외를 얻고있다 "기본"java.lang.ExceptionInInitializerError 에 의한 지수 25 근처에 불법 문자 범위^[a-zA-Z0-9 _ \.! ~ *() = + $, - \ s] {3,20} $ – Learner

+0

가능한 복제본 [Java는 regex \ s와 작동하지 않습니다 : 잘못된 이스케이프 시퀀스] (http://stackoverflow.com/questions/2733255/java-doesnt-work-with-regex-s-says-invalid-escape-sequence) –

+0

@JoelBrewer 아니오, 이스케이프 처리만으로는 문제가 해결되지 않습니다. –

답변

1

\\s 번만 탈출해야합니다. 또한 문자 클래스 내에서 .을 탈출 할 필요가 없습니다. 문자 클래스 내의 .\\.은 리터럴 점과 일치합니다.

Pattern DISPLAY_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_.!~*()=+$,\\s-]{3,20}$"); 

또한 문자 클래스의 첫 번째 또는 마지막에 -을 넣습니다. 문자 클래스의 중심에있는 -이 범위 연산자로 작동 할 수 있기 때문입니다. regex.PatternSyntaxException: Illegal character range 예외 범위는 백 슬래시 일치를 수행 할 경우, ,\\s

사이에 존재하는 다음 정확히 세 번 이스케이프 할 필요가없는 것으로, 주로 있기 때문에이 문제이다.

Pattern DISPLAY_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}$"); 

예 : java.util.regex.PatternSyntaxException :

System.out.println("foo-bar bar8998~*foo".matches("[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}")); // true 
System.out.println("fo".matches("[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}")); // false 
+0

@ErwinBolwidt 업데이트. –

+0

이제는 "^ [a-zA-Z0-9 _. * ~) (+ $, - \\ s] {3,20} $"로 이동하면 이상합니다. 중간에 옮긴다. 괜찮다. 아무 생각이 없다. – Learner

+0

예외는 무엇입니까? charcater 클래스 내에서'--'를 같은 문자 클래스 자체의 중간에서 마지막으로 이동해야합니다. –