【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);
}
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というキーワードを含んでいるからな。


GASでよく使う正規表現一覧
名前 | 正規表現 |
---|---|
/\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 |

練習問題
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つ以上含む部分にマッチします。