文字列の中に同じ文字が3つ連続で並んでいる箇所がいくつかあるか求める、というプログラミングの練習問題がある。
例えば、文字列が"abcXXXabc"の場合、答えは1になる。
また、"xxxabyyyycd"の場合は、yが4つ並んでいる箇所には3連続のyが2か所あるので、答えは3ということになる。
ループを使うのが普通の解き方だが、正規表現を使うと、とても簡単に解くことができる。
function countTriple(str){
let arr = str.match(/(.)(?=\1{2})/g) ?? [];
return arr.length;
}
ここで必要なのは先読みという手法だ。単純に「(.)\1{2}」などとすると、重なり合っている部分、つまり先の例ではyが4つ並んでいる部分で1つしかマッチしないのだ。
ちなみに、2行目の「?? [] 」というのは、マッチしなかったときにmatch()がnullを返すので、そのまま長さを求めるとエラーになってしまうため、nullのときは長さ0の配列を代入するという意味である。