スキップしてメイン コンテンツに移動

GASで正規表現マスター

GASで正規表現マスター

GASで正規表現を使ったデータクレンジング

Google Apps Script(GAS)はスプレッドシートやドキュメントを自動化する強力なツールです。正規表現応用を組み合わせることで、テキストデータのクレンジングや整形を簡単に行えます。例えば、メールアドレスの形式チェックや電話番号の統一フォーマット化など、日常的に発生するデータの不整合を自動で修正できます。

以下は、GASで正規表現を使ってセル内のメールアドレスを検証し、無効なものをハイライトするサンプルです。

function validateEmails() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getDataRange();
  const values = range.getValues();
  const emailRegex = /^[\\w.-]+@[\\w.-]+\\.\\w+$/;
  const bgColors = [];

  values.forEach(row => {
    const cell = row[0];
    if (!emailRegex.test(cell)) {
      bgColors.push(['#ffdddd']); // 無効なメールは薄い赤でハイライト
    } else {
      bgColors.push(['#ffffff']);
    }
  });

  range.setBackgrounds(bgColors);
}

このスクリプトは、正規表現応用の基本的な使い方を示しています。さらに複雑なパターンを組み合わせることで、住所の標準化や日付形式の統一など、さまざまなデータクレンジングタスクに対応できます。

LookaheadとLookbehindで高度な検索を実現

Lookahead(先読み)とLookbehind(後読み)は、正規表現の中でも特に高度な検索を可能にする機能です。GAS内でこれらを活用すると、特定の条件を満たすテキストだけを抽出したり、置換対象を限定したりできます。

例えば、スプレッドシート内のテキストから「#」で始まり、スペースで終わるタグだけを抽出したい場合、以下のように書けます。

function extractHashtags() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const hashtagRegex = /(?<=\\s)#\\w+(?=\\s)/g; // 先読みと後読みを使用

  values.forEach(row => {
    const text = row[0];
    const matches = text.match(hashtagRegex);
    if (matches) {
      Logger.log('Found hashtags: ' + matches.join(', '));
    }
  });
}

LookbehindはJavaScript(GASの実装)でサポートされているため、前方の文字列を考慮した抽出が可能です。これにより、例えば「@username」のように「@」の後に続くユーザー名だけを取得することも簡単に実装できます。

高度な検索を行う際は、正規表現のパフォーマンスにも注意が必要です。複雑なパターンを多用すると実行時間が増加するため、必要に応じて正規表現を分割して処理するテクニックも併せて学びましょう。

グループ化と置換パターンで複雑な抽出を行う

グループ化(括弧)と置換パターンは、正規表現応用の中核を成す概念です。グループ化を使うことで、部分文字列をキャプチャし、後で参照したり置換したりできます。GASでの置換パターンは、String.replace()RegExp.prototype.replace()を利用して実装します。

以下は、日付形式を「YYYY/MM/DD」から「DD-MM-YYYY」に変換する例です。グループ化と置換パターンを組み合わせています。

function reformatDates() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const dateRegex = /(\\d{4})-(\\d{2})-(\\d{2})/; // 年-月-日をキャプチャ

  values.forEach(row => {
    const text = row[0];
    const newText = text.replace(dateRegex, '$3-$2-$1'); // 置換パターンで順序を入れ替え
    Logger.log('Original: ' + text + ' -> Reformatted: ' + newText);
  });
}

さらに複雑な抽出では、ネストされたグループや非キャプチャグループ(?:)を使うことで、不要な部分を除外しつつ必要な情報だけを取得できます。例えば、HTMLタグ内の属性値だけを抽出する場合、以下のように書けます。

const html = 'Link';
const attrRegex = /]*href=\"([^\"]*)\"/;
const match = html.match(attrRegex);
if (match) {
  Logger.log('URL: ' + match[1]); // href属性の値を取得
}

このように、グループ化と置換パターンを駆使することで、複雑な抽出やデータクレンジングを効率的に行えます。正規表現応用のスキルを磨くことで、GASでのテキスト処理がより強力になります。

この記事はAIによって作成されました。

コメント