2011-06-10 6 views
10

정규식으로 독점적으로 수행 할 수있는 솔루션을 찾고 있습니다. 변수, 하위 문자열 등을 사용하면 이것이 쉽다는 것을 알고 있습니다.정규식 - 한 행에 4 자리 숫자이지만 모두 0이 아님

그리고 vim을 언급하더라도 PCRE 스타일 정규식 구문을 찾고 있습니다.

문자열을 4 자리 숫자로 식별해야하며 모두 0이 될 수 없습니다. 다음 문자열이 일치하는 것입니다 그래서 :

0001 
1000 
1234 
0101 

그리고이없는 것이 그 중요한 경우, 큰 문자열에서 설정된 위치에서 발생하는 문자열입니다

0000 

; 나는 그것이해야한다고 생각하지 않는다. 예를

를 들어
xxxxxxxxxxxx0001xxxxx 
xxxxxxxxxxxx1000xxxxx 
xxxxxxxxxxxx1234xxxxx 
xxxxxxxxxxxx0101xxxxx 
xxxxxxxxxxxx0101xxxxx 
xxxxxxxxxxxx0000xxxxx 
+0

위와 같이 if ((substr (8,4) * 1)> 0)와 같은 substr을 사용하면 괜찮습니다. – Grumpy

+0

세련된 질문입니다. 감사합니다. – user210757

+0

오 와우. 나는 당신이 있던 거의 정확한 것을 추가하려고하고 있었고, 그때 당신은 1 분 전에 나를 때렸다. 나는 당신의 편집으로 되돌아 갔다. – Earlz

답변

31
(?<!\d)(?!0000)\d{4}(?!\d) 

또는, 더 친절/maintainably/올바로 수행 :

m{ 
    (?<! \d ) # current point cannot follow a digit 
    (?! 0000) # current point must not precede "0000" 
    \d{4}   # match four digits at this point, provided... 
    (?! \d ) # that they are not then followed by another digit 
}x 
+2

독자주의 사항 : 더 긴 숫자 문자열로 된 부분 문자열을 제외 할 것인지 묻는 질문이 아니라면'(?! 0000) \ d {4}'(또는 (?! 0 {4}) \ d {4}'). – sawa

+0

이제 VIM에서이 작업을 수행하는 방법을 보여줍니다! 매우 마법의 깃발을 사용할 수 있습니다 – user210757

3

그냥 4 자리 숫자에 대한 일치 (\d{4} 그것을해야한다) 한 다음 일치 '0000' 같지 않은 것을 확인합니다.

+0

스크립트를 쓰지 않았다. 변수가 없다. grep과 vim을 사용하고있다. – user210757

4

PCRE가 lookarounds을 지원하기 때문에 \d{4}(?<!0000)은 0이 아닌 연속 된 문자 4 개를 찾습니다. 그것을 실행 here에서보십시오. 이 경기는 문자열의 올바른 위치에 발생 있는지 확인해야합니다

, 당신은 사용할 수 있습니다 ^.{X}\d{4}(?<!0000).{Y}$ 대신, XY 각각 문자를 이전 및 다음 수있는 곳 (당신의 예 12 및 5).

+0

일반적으로 lookbehead를 사용하는 것이 lookbehind를 사용하는 것보다 좋다 (tchrist의 답처럼). – sawa

+0

@sawa - 성능 문제입니까? – dlras2

+0

오른쪽. 공연. 또한 lookbehind는 일부 정규식 엔진에서 제한이있을 수도 있고 전혀 구현되지 않을 수도 있습니다. – sawa

5

나는 내가 가장 당신에게 정규식 answe을 줄 줄 알았는데, 여기에 해답의 일부는 정규 표현식이 아니었다 불평 때문에 아르 자형. 이것은 더 나은 방법이 거기에 아마, 원시적이지만 작동합니까 : 1-9에 누워 일치에서 0000을 방지해야한다 제외한 각 위치에서 0-9 포함 뭔가에 대한

([1-9][0-9][0-9][0-9]|[0-9][1-9][0-9][0-9]|[0-9][0-9][1-9][0-9]|[0-9][0-9][0-9][1-9]) 

이 있는지 확인합니다. 정규 표현식 파서가 해당 메타 문자를 지원하는 경우 [0-9] 대신 \ d를 사용하여이 코드를 더 간단하게 작성할 수 있습니다.

+0

감사합니다 @ 리처드, 그것은 원시 수도 있지만 작동 :) – Mikel

관련 문제