处理字符串时,经常需要筛选出包含重复字母的内容,比如校验密码不能出现连续相同字符、提取文本中重复出现的字母片段等,使用正则表达式可以快速实现这类需求,不需要编写复杂的循环遍历逻辑。

基础匹配思路
匹配包含重复字母的字符串,核心是利用正则表达式的反向引用特性。反向引用可以引用前面捕获分组匹配到的内容,只要后续出现和捕获内容相同的字符,就说明存在重复字母。
基础的匹配任意重复字母的正则写法是([a-zA-Z])1,其中([a-zA-Z])是捕获分组,匹配任意一个大小写字母,1表示引用第一个捕获分组匹配到的内容,也就是和前面字母相同的字符,只要字符串中存在连续两个相同的字母,就会被匹配到。
不同场景的正则写法
1. 匹配包含连续重复字母的字符串
如果需要判断整个字符串中是否存在至少一组连续重复的字母,直接使用上面的基础正则即可,示例正则:
([a-zA-Z])1
2. 匹配包含非连续重复字母的字符串
如果需要匹配字符串中存在同一个字母出现至少两次,不管是否连续,需要使用正向预查的写法,正则如下:
([a-zA-Z]).*1
这里的.*表示两个相同字母之间可以有任意数量的任意字符,只要同一个字母出现两次就会被匹配。
3. 匹配仅包含重复字母的字符串
如果需要整个字符串都是由同一个字母重复组成,比如"aa"、"BBBB"这类,正则写法为:
^([a-zA-Z])1+$
^表示字符串开头,$表示字符串结尾,1+表示第一个捕获的字母重复出现至少一次,整体就是整个字符串都是同一个字母的重复。
不同编程语言的实现示例
JavaScript示例
使用RegExp对象和test方法判断是否匹配:
// 判断字符串是否包含连续重复字母
function hasRepeatLetter(str) {
const reg = /([a-zA-Z])1/;
return reg.test(str);
}
console.log(hasRepeatLetter("hello")); // true,ll是重复字母
console.log(hasRepeatLetter("world")); // false,没有重复字母
Python示例
使用re模块的search方法进行匹配:
import re
def has_repeat_letter(s):
# 匹配包含连续重复字母的字符串
pattern = r'([a-zA-Z])1'
return re.search(pattern, s) is not None
print(has_repeat_letter("test")) # True,tt是重复字母
print(has_repeat_letter("demo")) # False
Java示例
使用Pattern和Matcher类实现匹配:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RepeatLetterMatch {
public static boolean hasRepeatLetter(String str) {
// 匹配包含非连续重复字母的字符串
Pattern pattern = Pattern.compile("([a-zA-Z]).*\1");
Matcher matcher = pattern.matcher(str);
return matcher.find();
}
public static void main(String[] args) {
System.out.println(hasRepeatLetter("abca")); // true,a出现两次
System.out.println(hasRepeatLetter("abcd")); // false
}
}
注意事项
- 如果需要同时匹配大小写不敏感的重复字母,比如"Aa"也算重复,需要给正则加上
i标志,比如/([a-zA-Z])1/i。 - 反向引用的数字要和捕获分组的顺序对应,第一个捕获分组用
1,第二个用2,以此类推。 - 如果字符串中包含非字母字符,上面的正则会自动忽略非字母内容,只匹配字母的重复情况,如果需要包含其他字符的重复,可以把正则中的
[a-zA-Z]替换成对应的字符范围。