【GAS入門】正規表現の使い方〜 変数置換・抽出・改行テクまで一挙解説!〜

GASで正規表現を使ってみたいんだけど、どこから手をつけたらいいのか…知識が全然なくて不安で…
猫男
猫男
catman
catman
まずは基本から始めようか。正規表現は文字列操作の強力な武器だ。

GASにおける正規表現の基礎

正規表現は、特定のパターンに一致する文字列を検索、変更したり、抽出するための表現。GASでもJavaScriptと同様に使えるぞ。

GAS正規表現の基礎:matchメソッドを使う

まず、matchを使ってみよう。

正規表現を使って、ある文字列から特定のパターンを見つけられる。


function findEmails(text) {
  var emailPattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
  return text.match(emailPattern);
}

function test(){
  Logger.log(findEmails("Contact us at info@example.com or support@example.org."));
}

ここでのmatchメソッドは、正規表現に一致する文字列の配列を返す。

/…/gは正規表現のグローバルフラグで、検索対象の文字列から、最初の1つではなく全部の一致を拾ってくれる。

今回のスクリプトでは文字列中のメールアドレスをすべて抽出できるぞ。

[info@example.com, support@example.org]

のような実行結果になるはずだ。

GAS正規表現の応用:置換メソッドを使う

文字列を正規表現で置換するにはreplaceメソッドを使うぞ。


function maskEmails(text) {
  var emailPattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
  return text.replace(emailPattern, "[secret]");
}

function test(){
  Logger.log(maskEmails("Email us at info@example.com."));
}

この例では、テキスト中のすべてのメールアドレスを「 [secret] 」に置換している。

最初は難しいと思ってたけど、少しづつ分かり始めました!次のステップはなんでしょうか?
猫男
猫男

GASで変数を利用した正規表現操作

GASでも変数で動的に正規表現を作れるぞ。

GAS正規表現と変数の併用

例えば、ユーザー指定のパターンや動的に変化する内容に対応する場合だ。


function highlightKeyword(text, keyword) {
  var pattern = new RegExp("\\b" + keyword + "\\b", "g");
  return text.replace(pattern, "[highlight]" + keyword + "[/highlight]");
}

function test(){
  Logger.log(highlightKeyword("Highlight the word cat in this sentence.", "cat"));
}

上の例では、ユーザーが指定したキーワードに基づいて正規表現を作成し、その部分を[highlight]で囲ってハイライトしている。

Highlight the word [highlight]cat[/highlight] in this sentence.

と出力されるはずだ。

GAS正規表現で改行を考慮する

複数行に渡る操作では、mフラグが便利だ。


function findLinesWithKeyword(text, keyword) {
  var pattern = new RegExp("^.*" + keyword + ".*$", "gm");
  return text.match(pattern);
}

function test(){
  Logger.log(findLinesWithKeyword("Line one\nKeyword line\nLast line", "Keyword"));
}

mフラグを使うと、行頭(^)と行末($)が「文字列全体」ではなく「各行の先頭・末尾」に対応する。

[Keyword line]

と出力されるはずだ。なんせ、この行はKeywordというキーワードを含んでいるからな。

様々な操作ができそうですね!こんなに活用できるなんて知りませんでした!
猫男
猫男
catman
catman
良いぞ。その興味を大事にしよう。次はGASで使えそうな正規表現の例をいくつかリストアップしていこう。

GASでよく使う正規表現一覧

名前 正規表現
Email /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/
URL /(https?:\/\/[^\s]+)/g
Phone Number /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g
Whitespace /\s+/g
Digits /\d+/g
これでGASでの正規表現がさらに自由に使いこなせるようになりそうです!ありがとうございました、catman!
猫男
猫男

 

練習問題

1. 次のテキスト “Call me at 123-456-7890 or 098-765-4321.” において、すべての電話番号を'[電話番号]でマスクしてください。
2. GASでURLを検出してリストアップする関数を書いてみましょう。

 

 

解答・解説


function maskPhoneNumbers(text) {
  var phonePattern = /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g;
  return text.replace(phonePattern, "[電話番号]");
}

Logger.log(maskPhoneNumbers("Call me at 123-456-7890 or 098-765-4321."));

replaceメソッドを使っています。電話番号のパターンに一致する部分を”[電話番号]”に置換しました。

 


function extractUrls(text) {
  var urlPattern = /(https?:\/\/[^\s]+)/g;
  return text.match(urlPattern);
}

Logger.log(extractUrls("Visit https://example.com or http://another.com."));

matchメソッドを利用して、正規表現に一致するURLをリストとして取得しています。[^\s]はスペース以外の文字を1つ以上含む部分にマッチします。