earthpg:GAS専門のプログラミングスクール

GASで正規表現をフル活用:matchから変数置換、改行テクニックまで一挙解説!

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

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);
}

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

ここでのmatchメソッドは、正規表現に一致する文字列の配列を返します。/…/gは正規表現のグローバルフラグで、複数マッチを考慮します。

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, "[redacted]");
}

Logger.log(maskEmails("Email us at info@example.com."));

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

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

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

GAS正規表現と変数の併用

変数で動的に正規表現を作ることもできる。例えば、ユーザー指定のパターンや動的に変化する内容に対応する場合だ。


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

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

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

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

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


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

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

mフラグは行頭(^)と行末($)をそれぞれ各行の頭と末尾に適用する。

様々な操作ができそうですね!こんなに活用できるなんて知りませんでした!
猫男
猫男
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つ以上含む部分にマッチします。