正则表达式捕获:重复两个字母

时间:2014-07-19 12:23:30

标签: php regex

我正在尝试检查一个单词是否有三个或更多重复的“两个字母削减”,但只有重复相同的字母时,表达式才会返回true。为什么呢?

(([a-z])([^\1]))\1\2{2,} 
    ^      ^     ^ ^  ^
    1      2     3 4  5

1)任何字母(捕获集合\ 1)
2)未设置1的任何字符(捕获集合\ 2)
3)再次捕获\ 1 4)再次捕获\ 2 5)至少两次

应该返回TRUE的单词: asasasassafasf,ereeeerererere,dddddtrtrtrtuuuuuuu

应该返回FALSE的单词: dddddddd,rrrrrrrrrrlkajf,fffffffssssssytytfffffff

2 个答案:

答案 0 :(得分:3)

您可以使用negative lookahead assertion

解决此问题
([a-z])((?!\1)[a-z])(?:\1\2){2,}

测试live on regex101.com

<强>解释

([a-z])  # Match and capture a single ASCII letter in group 1
(        # Match and capture...
 (?!\1)  # unless it's the same letter as the one captured before
 [a-z]   # a single ASCII letter in group 2
)        # End of group 2
(?:\1\2) # Match those two letters
{2,}     # two or more times

答案 1 :(得分:2)

根据您的简短描述,正则表达式适用于您:

(([a-z])((?!\2)[a-z]))\1{2}

Regex Demo

  • ([a-z]) - 匹配字母a到z并在组中捕获它们
  • \2 - 对第2组的反向引用
  • (?!\2)[a-z]) - 匹配非#2组的字母a到z
  • \1{2} 2个反向引用#1
  • 的实例

或使用相对反向引用编号

(([a-z])(?!\g{-1})[a-z])\1{2}

简而言之,这个正则表达式匹配连续3次出现不同字符的字母对。