我正在尝试检查一个单词是否有三个或更多重复的“两个字母削减”,但只有重复相同的字母时,表达式才会返回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
答案 0 :(得分:3)
您可以使用negative lookahead assertion:
解决此问题([a-z])((?!\1)[a-z])(?:\1\2){2,}
<强>解释强>
([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}
([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次出现不同字符的字母对。