正则表达式匹配交替的字符

时间:2013-04-14 16:52:24

标签: php regex

我正在尝试匹配一串数字并检测是否存在交替数字的模式。例如,3131是匹配项。 4596961是匹配项,因为它包含9696433215不匹配,因为没有交替的数字。

我写的当前表达式是/(\d)(\d)(\\1\\2)+/,它运行良好 EXCEPT 它也匹配重复的连续数字。例如,它匹配5555,当我不想要它时,因为5555不是由交替的数字组成(至少严格来说)。

基本上,我想告诉Regex引擎第一个\d和第二个\d是不同的字符。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

使用lookahead assertion

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

此外,如果使用'...'字符串,则只需要一个反斜杠用于转义序列:

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 :(得分:3)

如果你的正则表达式支持负向前瞻,你可以确保第二个数字与第一个数字不同:

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

这可确保初始(\d)不会再次出现同样的事情。

顺便说一句,只是缩短模式的想法:

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

您的电话是否更易于阅读。