1.通過利用正則來匹配字符串中有兩個或兩個以上的連續字符的子字符串
<script>
var reg =/(.)\1{1,}/g;//正則表達式
var str = "abbcccdeeeefgaa";//要演示的目標字符串
var res1 = str.match(reg)//匹配兩個或兩個以上連續字符
var res2 = str.replace(reg,"$1")//其中一種應用,實現字符串去重
console.log("匹配結果:",res1)
console.log("字符串去重結果:",res2)
</script>
打印結果:
2.分析
2.1
var reg =/(.)\1{0,}/g;實現了對字符串中連續兩個或兩個以上的字符匹配,改正則表達式實際上等價於:/(.)\1+/g。 其中(.)表示匹配任意字符,在正則表達式中的小括號"()“代表分組的意思。 如果再其後面出現\1則是代表與第一個小括號中要匹配的內容相同,同理,例如“/(.)/1(\d)/2/g”中的“/2”代表的就是”(\d)",其餘的以此類推,$1和$2則分別表示第一個小括號和第二個小括號所匹配到的內容。“1”後面的“+”表示“\1”的次數,這裏其實就相當於至少有一個“\1”,也就是再加上前面的“(.)”就表示可以匹配至少兩個連續的字符了。
2.2
這裏其實是實現字符串去重的其中一種方法了,具體是通過字符的replace方法來實現的,replace接收兩個參數,第一個爲要替換的部分,也可以是正則表達式,第二個參數表示要替換的目標內容,由上面的打印結果可知,[“bb”, “ccc”, “eeee”, “aa”]爲正則表達式所匹配到的內容,由於是全局匹配,所以"$1"則表示第一個小括號"(.)"所匹配到的單個字符,然後再將通過正則表達式所匹配到的內容全部換成單個字符就可以實現字符串去重了。
⚠️注意
單獨斜槓的 \1 , \2 表示的是反向引用:
‘\1’ 匹配的是 所獲取的第1個()匹配的引用。例如,’(\d)\1’ 匹配兩個連續數字字符。如33aa 中的33
‘\2’ 匹配的是 所獲取的第2個()匹配的引用。例如,’(\d)(a)\1’ 匹配第一是數字第二是字符a,第三\1必須匹配第一個一樣的數字重複一次,也就是被引用一次。如9a9 被匹配,但9a8不會被匹配,因爲第三位的\1必須是9纔可以,‘(\d)(a)\2’ 匹配第一個是一個數字,第二個是a,第三個\2必須是第二組()中匹配一樣的,如,8aa被匹配,但8ab,7a7不會被匹配,第三位必須是第二組字符的複製版,也是就引用第二組正則的匹配內容。