我正在尝试匹配一串数字并检测是否存在交替数字的模式。例如,3131
是一场比赛。4596961
是匹配项,因为它包含9696
. 433215
不匹配,因为没有交替的数字。
我写的当前表达式是/(\d)(\d)(\\1\\2)+/
,它工作得很好,除了它也匹配重复的连续数字。例如,它匹配 5555,而我不希望它匹配,因为 5555 不是由交替数字组成的(至少严格来说不是)。
本质上,我想告诉正则表达式引擎,第一个\d
和第二个\d
是不同的字符。
我该怎么做呢?
使用前瞻断言:
/(\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];
}
如果您的正则表达式支持负前瞻,您可以确保第二个数字与第一个不同:
/(\d)(?!\\1)(\d)\\1\\2/
这样可以确保首字母(\d)
后面不会再出现相同的内容。
顺便说一句,只是一个缩短模式的想法:
/((\d)(?!\\2)\d)\\1/
这是否更容易阅读是您的决定。