2013-11-27 1 views
1

(\w+)?(\w*) 사이에 정규 표현식의 차이점이 있습니까? 제가 누락 된 것이 있는지 이해할 수 없습니다. 두 코드를 다른 코드로 사용했지만 똑같은 것을하는 것처럼 보입니다. 기본적으로 동일합니다. 맞습니까?( w +)입니까? 와 ( w *) 동일합니까?

+0

가능한 중복 [정규식 : 더하기 기호 대 별표] (http://stackoverflow.com/questions/18364673/regex-plus-sign-vs-asterisk) – PeeHaa

답변

7
  • (\w+)?(\w*) 사이에 차이없습니다. 둘 다 \w의 0 번 이상 일치합니다. 이것은 Perl의 Regexp-Compare 모듈을 사용하여 테스트를 수행하여 테스트 할 수도 있습니다. 예상 결과가 나옵니다. 캡처 그룹의 측면에서

  • 큰 차이있다. (\w+)?의 경우 실패하면 캡처 그룹이 초기화되지 않습니다. (\w*)의 경우 초기화되지만 비어있게됩니다. 따라서 Perl에서 "!"=~/(\w+)?/; print $1;은 정의되지 않은 $ 1에 대한 경고를 반환하고 "!"=~/(\w*)/; print $1;은 빈 문자열입니다. 성능의 측면에서

  • (\w*)이어야합니다 약간 정규 표현식 엔진이 할 따라서 선호하는 것으로 단계의 수의 측면에서 더 나은. 이것은 물론 엔진에 달려 있습니다. 그러나 (\w*)을 사용하면 엔진은 (\w+)?과 비교하여 백 트랙킹을 수행 할 필요가 없습니다.

    예를 들어 Perl에서 use re 'debug' 지시문을 사용하고 두 정규 표현식을 빈 문자열과 비교했습니다. 당신은 그들 각각의 단계를 비교할 수 있습니다

""=~/(\w+)?/

Matching REx "(\w+)?" against "" 
    0 <> <>     | 1:CURLYX[0] {0,1}(10) 
    0 <> <>     | 9: WHILEM(0) 
            whilem: matched 0 out of 0..1 
    0 <> <>     | 3: OPEN1(5) 
    0 <> <>     | 5: PLUS(7) 
             ALNUM can match 0 times out of 2147483647... 
             failed... 
            whilem: failed, trying continuation... 
    0 <> <>     | 10: NOTHING(11) 
    0 <> <>     | 11: END(0) 

Match successful! 

""=~/(\w*)/

Matching REx "(\w*)" against "" 
    0 <> <>     | 1:OPEN1(3) 
    0 <> <>     | 3:STAR(5) 
            ALNUM can match 0 times out of 2147483647... 
    0 <> <>     | 5: CLOSE1(7) 
    0 <> <>     | 7: END(0) 
Match successful! 

PS합니다. 펄에 있지 않다면 RegexBuddy으로 정규 표현식을 디버깅하는 것이 가능하다고 생각합니다. (필자는 한번도 시도한 적이 없지만 많이 들었습니다.)

+0

결론 :'(\ w *)? '이 아니라'(\ w *)'를 사용하십시오! – psxls

2

기본적으로 동일합니다. 맞습니까?

예. 당신의 특별한 경우. (0 or 1) of (1 or more) = (0 or more). 그들이 일치 무엇 의 측면에서

+0

"해당 사례에서"사례를 제공 할 수 있습니까? 그들은 동일하지 않아? – OGHaza

+0

사람들이 돌보고 싶어합니다. 나는 당신의 패턴이 적용되는지 (예 : 중괄호 배치 등) 정규 표현식을주의 깊게 살펴 본다. 혼란 스럽다면 나는 그 의견을 삭제할 수 있습니다. – xagyg

관련 문제