2013-10-15 4 views
2

하나 이상의 문자열 범위를 가질 수있는 문자열이 있습니다. 이 올바른 문자열 :정규식이 예상대로 작동하지 않는 이유는 무엇입니까?

"" 
"asd-asd" 
"asd-asd;asd-asd" 
"asd-asd;asd-asd;" 
"asd-asd;asd-asd;asd0-asd1" 

그러나 문자열 "asd0-asd1-asd2"이 유효하지 않을 것이다. 다음 정규 표현식을 썼습니다 :

^(([^;-]+-[^;-]+);?)*$ 

그리고 예상대로 작동하지 않습니다. 왜?

+0

을'때문에 -'asd0-ASD'선택 사항이며,이 두 그룹으로 일치 할 수 '및''1-asd2 '. 그냥 그걸 해결할 수있는 깨끗한 방법을 찾으려 노력하고 있습니다. –

+0

''; "'이 (가) 유효한 일치일까요? 그렇지 않다면 왜 안 되겠습니까? –

답변

4

당신은 당신의 정규식은 좀 더 복잡 할 필요가 :

^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*)?$ 

설명 :

^    # Start of the string 
(    # Start of first group: 
[^;-]+-[^;-]+ # Match one "asd-asd" 
(    # Start of second group 
    ;    # Match ; 
    [^;-]+-[^;-]+ # Match another "asd-asd" 
)*    # Repeat the second group any number of times (including zero) 
)?    # Make the entire first group optional  
$    # End of string 
+0

('(...)'대신에'(? : ...)'을 사용하는 것도 가능합니다.) 그러나 정규 표현식은 그대로 읽을 정도로 어렵습니다. 어떤 사람들은 약간의 성능 혜택은 가치가 없습니다.) –

1

일치하기 때문에; 그것은; 선택 과목. 당신은 문맥으로 뭔가를 테스트하려고, 정규식이 일을하는 가장 쉬운 도구가 아닙니다.

1

세미콜론을 선택하지 않으려면 대신 (; | $)을 사용할 수 있습니다.
문자열 끝에없는 경우 세미콜론 일치를 강요합니다.

^(([^;-]+-[^;-]+)(;|$))*$ 
+0

아니요. 대시는 문자 클래스의 마지막 위치에있는 경우 리터럴로 간주됩니다. 모든 정규식 엔진은 다음과 같이 작동합니다. –

+0

별로 좋지 않습니다. '[; $]는'';''또는'$'문자와 일치 함을 의미합니다. 정규식 메타 문자는 문자 클래스 내에서 특별한 의미를 상실합니다. –

+1

이 버전은 어떻습니까? 나는 이번에 그것을 실제로 시험했다. 솔기가 좋다. –

0

@ 팀의 대답에 약간의 추가가있다. 이 정규식은 "asd-asd; asd-asd;"와 일치하지 않습니다. NET 정규식 라이브러리를 사용하고 있다면. 그러나 ';' 문자열이 끝나기 전에 옵션으로 모든 경우를 처리합니다.

^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$ 

지금이 잘못된를 제외하면 유효한 모든 문자열과 일치합니다 - "asd0-asd1-asd2"

+0

+1, 주목 해 주셔서 감사합니다! 그러나 이제 더 이상 빈 문자열과 일치하지 않습니다. –

관련 문제