概要
正規表現の繰り返しについてです。
パターンマッチの対象文字列が任意のn桁の場合、n桁分のマッチ条件を正規表現で書くこともできますが、効率が良くないです。
その場合に繰り返し文字をマッチする為の記述にします。
具体的には次のような書き方をします。
{n, m} //n回からm回まで繰り返す {n, } //n回以上繰り返す {n} //n回のみ繰り返す ? //0回または1回のみ + //1回以上繰り返す * //ゼロ回以上繰り返す
実際にコードを書いて動かしてみます
簡単なサンプルコードを書いてみます。
let test = /^a/; let pattern_str = "abcdef"; console.log(pattern_str.match(test));
これを動かしてみると出力は「Array [ “a” ]」という結果になります。
これは対象の文字列の先頭がaだった為にマッチしています。
次に対象の文字列を少し変えてみます。
let test2 = /^a/; let pattern_str2 = "bcadef"; console.log(pattern_str2.match(test2));
この場合は、出力は「null」になり、何もヒットしません。
先頭の文字列がbなので、ヒットしないというシンプルな動きになります。
では「n回からm回までを繰り返す」という例を書いてみます。
上記のサンプルを変更して次のコードを書いてみます。
let test3 = /a{4,7}/; let pattern_str3 = "bcaaadef"; console.log(pattern_str3.match(test3));
出力は「null」になります。
これは文字列aが4回から7回まで繰り返している場合にマッチします。
対象となる文字列の中にaは3回繰り返していますが、この場合の条件には一致しないのでnullになりました。
では、さらに上記のコードを次のように書いてみます。
let test4 = /a{4,7}/; let pattern_str4 = "bcaaaadef"; console.log(pattern_str4.match(test4));
この場合は、出力が「Array [ “aaaa” ]」になりました。
aが4回繰り返しているので、「4回から7回まで繰り返している」という条件にマッチする為です。
さらに次のコードを書いてみます。
let test5 = /a{4,7}/; let pattern_str5 = "bcaaaaaadef"; console.log(pattern_str5.match(test5));
出力は「Array [ “aaaaaa” ]」になります。
aが5回記述されている場合としてマッチします。
同様に、aが6回記述されている場合、7回記述されている場合もマッチします。
では、aが8回記述されている場合はどうなるのか。
次のように書いてみます。
let test6 = /a{4,7}/; let pattern_str6 = "bcaaaaaaaadef"; console.log(pattern_str6.match(test6));
出力は「Array [ “aaaaaaa” ]」になります。
対象の文字列にaが8個記述されている場合でも、「4回から7回」記述されているというパターンとしてマッチする。という動作になりました。
実際にコードを書いて動かした結果
正規表現のパターンマッチの条件一つとっても、やって試してみると動きがよくわかります。
上記の「4回から7回までの繰り返しのマッチ」ではaが8個記述されている場合でも、aが7回繰り返されているという条件でマッチすることがわかります。
文章で書くと「7回まで」という表現が紛らわしいですが、対象の文字列中に7回繰り返されているという条件が厳密に実行されることがわかります。