見出し画像

【GAS】matchメソッドの挙動(自分用メモ)

はじめに


お手軽便利なmatchメソッドですが、teketekeという単語と一緒に見ると、当たり前なようで面白い挙動をしていると思ったので、気づきをメモ( ..)φしておきます。

いわゆる教科書的記述

『Java Script』(D. Flanagan, 第7版 P324)は、matchメソッドについてこう書いています。

「正規表現にgフラグが指定されていると、マッチしたすべての文字列を含む配列を返します。」

ふむふむ。
続いてMDNの記述はこちら。

「The match() method retrieves the result of matching a string against a regular expression.」(「日本語」モードでは「match() メソッドは、正規表現に対する文字列の照合結果を受け取ります。」)

ふむふむ。ですよね。(あれ、でも、、、?)

どちらの挙動か調べてみた

さらっと納得してしまいそうな記述なのですが、「マッチしたすべての文字列を含む配列を返します。」という教科書的なこの文章、実はちょっと要注意のような気もします。

例えば、

TeketekeHeberekeという文字列を調べて、〇e〇に「マッチしたすべての文字列を含む配列を返します。」

と言われたら、以下の①と②のどちらを想像しますか?

①['Tek', 'ket', 'tek', 'keH', 'Heb', 'ber', 'rek']
②['Tek', 'tek', 'Heb', 'rek']

私には、上記①の「ket」も「keH」も「ber」も、〇e〇という要件を満たしているように見えてしまいました。

そして、もしこれが、「「TeketekeHebereke」から「〇e〇」に「マッチしたすべての文字列」を抜き出しましょう」、という数学の問題だったとしたら?

「各文字は1回ずつしか使えない、そして前から順に取っていく」という2つの条件が明示されていない限り、数学の問題としては、①が正解のような気がします。

そこで、GASのmatchメソッドの仕様はどうなのか実験してみたところ、上記の②の仕様で設定されていることが分かりました。

function test({  //strの中から「〇e〇」のセットをあるだけ探す

  const str = "TeketekeHebereke";

  const regEx = /.e./g 
 const resultArr = str.match(regEx);

  console.log(resultArr); //   ['Tek', 'tek', 'Heb', 'rek'] 

}

gフラグ付き正規表現を引数とするmatchメソッドの挙動

つまり、先頭の文字から評価していって、「Tek」を見つけると、そのマッチした文字列の最後のインデックスの文字までについては評価を終了し(つまり「eke」と「ket」については評価しない)、次のインデックスの文字から新たに、マッチする文字列を探しに行く、という仕様のようです。

知っておかないとハマりそうなので、自分用にメモしておきます。

【参考図書】


この記事が気に入ったらサポートをしてみませんか?