GASのMatchメソッドの使い方と正規表現

はじめに

GAS(Google Apps Script)を使えば、Googleのサービスを始めあらゆるサービスと連携することができます。
GASでプログラムを開発していると文字列を検索したり、抽出したいことがあります。
そんな時に使えるのがMatchメソッドになります。
GASのMatchメソッドでは正規表現を使うことができますので、検索したい対象の文字列から任意の文字列を検索することが可能になります。Matchメソッドを使えば、メールの本文を検索したり、Webページから欲しい情報を抜き取ったり(スクレイピング)、なんてことも可能になります。
GASはGoogleにログインできればすぐに始められますし、上述した通り他のサービスとの連携も容易(ライブラリが用意されています)、特にWeb系のサービスとは相性が非常に良いです。
またJavaScriptとの互換性がありますので、GASで覚えたコードをJavaScriptで記述することも可能になります。※一部使えないメソッド等あるようですが。
本記事ではGASのMatchメソッドの基本的な使い方と、正規表現の基本的な使い方を紹介します。

Matchメソッドの使い方

基本形

まずMatchメソッドの基本的な使い方を見ていきましょう。
書き方は以下になります。

文字列.match(/検索したい文字列/)

以下コードを書いて実行してみましょう。

[コード]
function myFunction() {
  var str = "ABCDABCD";
  var result = str.match(/A/);
  console.log(result);
}


[ログ]
[20-10-08 13:58:37:691 JST] [ 'A', index: 0, input: 'ABCDABCD', groups: undefined ]

ABCDABCDという文字列からAを検索しています。
結果は配列(連想配列形式を含む)で返されます。
indexを見ると、0となっています。
Aという文字で検索をかけましたが、検索されたのは、先頭のAのみになります。
つまりMatchでは検索がヒットした最初の文字列の情報を返します。また返却された結果を操作することも可能です。

console.log(result[0]) → Aの値が取れます。
console.log(result[“index”]) → 添え字が取れます。
console.log(result[“input”]) → 対象文字列が取れます。

検索したい値が存在しない場合は、nullが返ってきます。

オプション

次にオプションを紹介します。
Matchメソッドのオプションは以下になります。

g:マッチしたものをすべて返します。
i:大文字と小文字を区別しない。
※その他にもyやmなどがあるようですが、本記事で使用しません。

では、上記のオプションを使って、文字列を検索してみましょう。

[コード]
function myFunction() {
  var str = "ABCD,EFGH,abcd,nefgh";
  var result = str.match(/ABC/gi);
  console.log(result);
}


[ログ]
[20-10-08 13:48:31:857 JST] [ 'ABC', 'abc' ]

ログを見てください。
検索文字列は「ABC」としましたが、オプションを付与することで大文字と小文字が区別されず、abcの値も取得することができました。
また上記でオプション無しで実行した場合は、indexやinputなどの情報が返ってきましたが、今回は、検索された値のみ返却されています。
gオプションを付与することで、検索された値をすべて返すことができます。また結果は、配列形式となりますので、添え字を指定して値を取得することも可能です。

console.log(result[0])

正規表現

GASのMatchメソッドでも正規表現を使って文字列を検索することができます。
正規表現とは 文字の集合体をパターンや特殊文字を使って表現する規則になります。

例えば、以下のような文字列があります。

I love a book. And also love a desk.

この中から最初の1文を取得したい場合は、以下のように正規表現を記載してあげます。

.*book

.(ドット)は改行以外の文字列すべてを指します
*(アスタリスク)は前の文字の0回以上の繰り返しとなります。
bookはそのまま文字列内のbookを指します。

つまり.*(ドットとアスタ)によって改行以外の文字が0回または1個以上の文字列を指定し(I love a)、
bookで終わるものを検索しています。取得したい文字列が決まっていれば、その文字列を直接打ってあげれば良いです。例えば以下のように。

I love a book

I love a bookが取得できます。
ただ実際はどういう文字列が入っているかわからない場合があることがほとんどです。
そういう場合に正規表現が力を発揮します。
例えば文字列の中から住所のみを取得したい場合があります。
以下のような文字列を想定します。

"名前:太郎 住所:千葉県柏市 電話:080-1111-2222 名前:あかね 住所:大阪府大阪市 電話:090-1111-2222 名前:次郎 住所:東京都豊島区 電話:070-2222-1111"

ここから住所を抜きだす場合、どういう風に指定してあげれば良いでしょうか?
ポイントは住所は記述の仕方が固定されている
ということです。
以下のような構造になっています。

~(都道府県)~(市区町村)

ですので、上記の(都道府県)と(市区町村)を手掛かりに検索することが可能になります。
正規表現は以下になります。

.*?[都道府県].*?[市区町村]

「.*?」の?(クエッションマーク)は、最短一致と言われるものです。
正規表現はデフォルトでは最長一致のものを検索する仕様となっています。
最短一致と最長一致はややわかりづらいので、簡単に例を挙げると、

ABCDABCDABCDABCD

という文字列があり、ABCを取得したいとします。
A.*Cとした場合は、ABCDABCDABCDABCDとなり、最初のAから最後のCま
でひとつらなりで一致してします。

A.*?Cとした場合、ABCDABCDABCDABCとなり、ABCが取得されます。

住所のケースでも?を入れてあげないと最長一致してしまい、最初の「都道府県」から最後の「市区町村」まで一つらなりで取得されます。ですので?を入れます。
[](棒括弧)はOR条件になります。一致させたい文字をそのまま入れます。
以下住所を取得したコードになります。

[コード]
function myFunction() {
  var str = "名前:太郎 住所:千葉県柏市 電話:080-1111-2222 名前:あかね 住所:大阪府大阪市 電話:090-1111-2222 名前:次郎 住所:東京都豊島区 電話:070-2222-1111";
  var result = str.match(/住所:.*?[都道府県].*?[市区町村]/gi);
  console.log(result);
}


ログ
[20-10-08 16:15:23:723 JST] [ '住所:千葉県柏市', '住所:大阪府大阪市', '住所:東京都豊島区' ]

次に電話番号を見ていきましょう。
住所同様に電話番号も形式が決まっています。
今回は携帯に限定した場合、正規表現は以下になります。

[0-9]{3}-[0-9]{4}-[0-9]{4}

[0-9]は数字の0~9の内どれかを示します。
隣の波括弧で桁数を示しています。
波括弧ではなく、[0-9][0-9][0-9]でも可能です。
こうすることで、080、090、070などの携帯の頭の番号三桁を一致させることができます。
先程の文字列を対象に電話番号を検索しましょう。

[コード]
function myFunction() {
  var str = "名前:太郎 住所:千葉県柏市 電話:080-1111-2222 名前:あかね 住所:大阪府大阪市 電話:090-1111-2222 名前:次郎 住所:東京都豊島区 電話:070-2222-1111";
  var result = str.match(/[0-9]{3}-[0-9]{4}-[0-9]{4}/gi);
  console.log(result);
}


[ログ]
[20-10-08 17:19:29:280 JST] [ '080-1111-2222', '090-1111-2222', '070-2222-1111' ]

その他の正規表現のパターンや特殊文字に関しては参考URLを参考にしてください。
正規表現の規則は言語や環境に影響されず、他の言語で正規表現を行う場合も基本的には同じ記述方式となります。
また正規表現を試したい場合は、Sakuraエディタを使うのが個人的にはお勧めです。
IT現場でも実際に良く使われます。
以下Sakuraエディタで正規表現を使う場合の手順です。

1.Sakuraエディタを開く
2.検索タブを押下
3.一番上の検索を押下
4.検索用のポップアップが出てくるので、「正規表現」にチェックを入れる

以上が正規表現の説明になります。
GASを使って、Gmailと連携してメッセージを検索する際や、スプレッドシート内の表の文字列を検索したり、
スクレイピングをする際などもこのMatchメソッドと正規表現が使えますので、覚えておくと大変便利です。

最後に

いかがでしたでしょうか?
GASのMatchメソッドの使い方と、正規表現の使い方を紹介しました。
Matchメソッドでは他にもif文と組み合わせて、文字列に対象の文字が含まれている場合に処理をする、などのように使用することもできます。是非色々と試してみてください。