我在很多面试题里都看到有在一个字符串里对相同字符的一些操作,获取相同字符大多人都会用遍历的方法,但是正则也是可以满足我们部分需求的。
语法
()\n
匹配相同字符需要用到\
这个元字符,而这个元字符又必须配合()
使用。
举例
求相同两个的数字
'1122'.match(/(\d)\1/g) //["11", "22"]
推演
有时候我们需要的不仅仅是两个相同数字,我们可以继续在后面继续\1
操作
求相同三个的字符
'112aadddddw2'.match(/(.)\1\1/g) //["ddd"]
大家可能对相同字符的数量判断有些不太明白,其实我们可以拆开看,()
匹配一次,\1
匹配一次,两个\1
就是两次,总共三次。当然,若是要进行多次匹配肯定相当麻烦,所以可以使用{}
进行\1
的替换。
'112aadddddw2'.match(/(.)\1{2}/g) //["ddd"]
在\1
后面使用{}
就是表示\1
的数量,不包含前面的\1
,也就是说真实的数量是n + 1
。
注意:
有人肯定会发问既然\1
表示前一个()
里面的内容,那么\2
呢,或者\n
呢
其实呢,\1
引用的是第 1 个子表达式,\2
引用的是第 2 个子表达式。
//求一个两位数字后面跟着三个字母的字符
/(\d)\1(\w)\2{2}/.test('x222aaas') // true
//求重复两次的一个数字跟着一个字母并最后跟着一个字母
/(\d(\w))\1\2/.test('2w2ww') // true