最近在看一些算法题的时候,发现在处理字符串中,经常需要找到字符串中重复的字符,然后进行其他操作。

寻找重复字符,我暂且分为以下几种。

匹配连续的单个重复字符

image_1bm9rc0067m13qs1iftgqt15s79.png-3kB

正则匹配比较简单:
var reg = /(.)\1+/g

. 匹配除行终结符外的任意字符
() 匹配组,即将匹配括号中的表达式保存到临时区域,并可以由\num 捕获
\1 引用第一个匹配组中的内容
+ 匹配前面的子表达式一次或多次,贪婪匹配(如果有,一直匹配下去)

该匹配可以简单的将有序字符串中重复的字符剔除
str.replace(reg, '$1')

匹配连续字符串

image_1bm9sda256551udfs371eni1palm.png-2.2kB

很容易,上述正则括号中添加一个重复元字符即可
var reg = /(.+)\1+/g

匹配非连续字符串

image_1bm9slab21d401lqh8n4149k1r2u13.png-1.9kB
var reg = /(.+)(?=.*\1)/g正则可以获取非连续重复出现的字符串。

(?=pattern) 是非获取匹配,且匹配但不消耗字符,正向肯定预查(Positive Lookahead),即当匹配该括号内容时,前面的表达式才能匹配成功

匹配限定次数的重复

image_1bm9t5lu424q12pdks81q1gvhm.png-2.5kB
图为限定3次的重复

var reg = /(.+)(?=(.*\1){2})/g; //重复3次
var reg = /(.+)(?=(.*\1){2,})/g; //重复3次以上

彩蛋

最后,推荐一个很好用的在线正则匹配站点,会将匹配结果以很友好的可视化形式呈现出来,同时在右侧栏有正则表达式的解释、具体匹配信息和常用表达式提示。
image_1bm9t8rmksrfk691j1012vosp613.png-64.1kB