2011-08-27 8 views
0

다음은 정규 표현식 ^[0-9A-Za-z]+(\s)*(-?(\s)*[0-9A-Za-z]+)*$과 일치합니다. 예를 들어 "dsffsd-fdsfds-dasda"과 같이 일치하지만 문자열이 "dsffsd-fdsfds-dasda-dasdas--dasdas-dsfs" 인 정규 표현식이 너무 복잡하다고 말하는 오류가 발생합니다. 사전에JavaScript에 대한 도움이 필요하십니까 정규 표현식 : 정규 표현식 너무 복잡함

어떤 도움을 주시면 감사하겠습니다, 덕분에

+1

http://jsfiddle.net에서 * 정규 표현식 너무 복잡해 * 오류를 게시 할 수 있습니까? – arnaud576875

+1

패턴이 너무 복잡하면'/ x' 또는'(? x)'를 통해 확장 모드를 사용하십시오. 설명을 위해 호흡 실과 주석을위한 공백을 추가하여 읽을 수 있습니다 :'^ [0-9A-Za-z] + (\ s) * (-? (s) * [0-9A-Za-z] +) * $'. 게다가 나는 그 패턴이 틀렸다는 것을 확신한다 :'(\ s *)'에'(\ s) *'와 같은 캡쳐 그룹에 대해 한정어가있다. 또한'\ w'는'[0-9A-Za-z] '보다 훨씬 더 읽기 쉽습니다. 대부분의 regex 엔진 (Javascript는 모든 정규 표현식 엔진 중에서 가장 최악입니다)에서도 더 정확합니다. '[A-Z]'는 언제나 틀린 때로는 틀린 강한 반 패턴이다. – tchrist

+0

@tchrist "항상 잘못 * 가끔 *"모순? – NullUserException

답변

3

정규식은이 오류가 이유 인, Catastrophic Backtracking에 해당된다. 패턴에 두 개의 하이픈 (--)이 허용되지 않으므로 문자열이 패턴과 일치하지 않습니다.

나는에 패턴을 단순화 할 수 있었다 : 나는이 권리를했다면

/^\w(?:-?\s*\w)*$/ 

는,이 패턴은 각 문자열을 일치하는 한 가지 방법을 수 있습니다, 그래서 같은 문제를 겪지 않을 것이다.
이러한 제약 조건이 필요하지 않은 경우 매우 간단하게 패턴을 입력 할 수 있습니다 (예 : /^[\w\s\-]*$/).
\w도 밑줄과 일치하지만 필요하면 수정해야합니다.

+0

흠 ... 나는'a - b'를 놓쳤다. 나는 그것에 대해 생각할 것이다.'/^\ w (? :(? : \ s * -)? \ s * \ w) * $ /'충분해야합니다. 어쨌든, 몇 시간 후에 다시 올게요. – Kobi