正则匹配字符串中重复字符(串)
最近在看一些算法题的时候,发现在处理字符串中,经常需要找到字符串中重复的字符,然后进行其他操作。
寻找重复字符,我暂且分为以下几种。
匹配连续的单个重复字符
正则匹配比较简单:var reg = /(.)\1+/g
. 匹配除行终结符外的任意字符
() 匹配组,即将匹配括号中的表达式保存到临时区域,并可以由\num 捕获
\1 引用第一个匹配组中的内容
+ 匹配前面的子表达式一次或多次,贪婪匹配(如果有,一直匹配下去)
该匹配可以简单的将有序字符串中重复的字符剔除str.replace(reg, '$1')
匹配连续字符串
很容易,上述正则括号中添加一个重复元字符即可var reg = /(.+)\1+/g
匹配非连续字符串
用var reg = /(.+)(?=.*\1)/g
正则可以获取非连续重复出现的字符串。
(?=pattern) 是非获取匹配,且匹配但不消耗字符,正向肯定预查(Positive Lookahead),即当匹配该括号内容时,前面的表达式才能匹配成功
匹配限定次数的重复
图为限定3次的重复
var reg = /(.+)(?=(.*\1){2})/g; //重复3次
var reg = /(.+)(?=(.*\1){2,})/g; //重复3次以上
彩蛋
最后,推荐一个很好用的在线正则匹配站点,会将匹配结果以很友好的可视化形式呈现出来,同时在右侧栏有正则表达式的解释、具体匹配信息和常用表达式提示。