2013-04-14 3 views
0

숫자 문자열을 일치시키고 숫자가 번갈아 나타나는 패턴이 있는지 감지하려고합니다. 예를 들어, 3131은 일치합니다. 45969619696을 포함하고 있으므로 일치합니다. 433215은 숫자가 번갈아 나타나지 않으므로 일치하지 않습니다.대 문자가 일치하는 정규 표현식

내가 작성한 현재 표현식은 /(\d)(\d)(\\1\\2)+/이며 잘 작동합니다. 예외 번호 반복되는 연속 숫자와도 일치합니다. 예를 들어 5555는 숫자가 번갈아 구성되어 있지 않기 때문에 (적어도 엄격하게 말하면 안됨) 5555와 일치합니다.

기본적으로 Regex 엔진에 첫 번째 \d과 두 번째 \d이 다른 문자가되어야한다고 말하고 싶습니다.

어떻게하면됩니까?

+2

어떤 엔진/향료를 사용하십니까? –

+0

PHP에서 이것을 사용하고 있습니다. – CodyBugstein

답변

3

사용하십시오 lookahead assertion : 또한

/(\d)(?!\1)(\d)(\1\2)+/ 

, 당신은 '...' 문자열을 사용하는 경우에만 이스케이프 시퀀스에 대한 하나의 백 슬래시가 필요합니다 : 당신의 정규식 맛이 부정적인 lookaheads을 지원하는 경우

if (preg_match(
    '/(\d) # Match a digit and store it in group number 1 
    (?!\1) # Assert that the next char is not the same as the one in group 1 
    (\d) # Match a digit, store it in group 2 
    (\1\2)+ # Match one or more repetitions of the two digits matched previously 
    /x', 
    $subject, $regs)) { 
    $result = $regs[0]; 
} 
+1

하나 또는 두 개의 백 슬래시가 필요한지 여부는 환경에 따라 다릅니다. 예를 들어, PHP에서'''-delimited 문자열은 끝에 /와 두 개의 백 슬래시가 필요합니다. –

+0

@ m.buettner : 그래도 그가 사용하고 있다면, 단일 및 이중 이스케이프 조합에는 –

+0

'\ d '는 유효한 이스케이프 시퀀스가 ​​아니기 때문에'\'는 리터럴 문자로 유지됩니다. –

3

, 당신은 보장 할 수를 두 번째 숫자가 첫 번째 숫자와 같지 않음 :

/(\d)(?!\\1)(\d)\\1\\2/ 

이렇게하면 초기 (\d)에 같은 것이 다시 나타나지 않습니다. 즉 더 쉽게 읽을의 여부를 전화 여부

/((\d)(?!\\2)\d)\\1/ 

: 그냥 생각 그런데

는 패턴을 단축합니다.

+0

두 번째 패턴에서는'1'과'2'가 반대가되어서는 안됩니까? 첫 번째 역 참조 참조 '(\ d)'매치 그룹에 두 번째 전체 패턴을 나타내는 두 번째 패턴이 있습니까? –

+0

@ bmorris591 그것이 그 길입니다. 역 참조는 왼쪽에서 오른쪽으로 괄호를 열어 계산됩니다. –

+0

아, 알겠습니다. 영리한. +1 –

관련 문제