Excel Regex:正規表現による文字列のマッチング

  • これを共有
Michael Brown

このチュートリアルでは、Excelで文字列をマッチさせるために正規表現を使用する方法について詳しく見ていきます。

セルの範囲から特定の値を見つけたいときはMATCH関数やXMATCH関数、セル内の特定の文字列を探したいときはFIND関数やSEARCH関数が便利です。 そして、セルに指定したパターンに一致する情報があるかどうかを知るには、もちろん正規表現を使います。 しかし、Excelはそのままでは正規表現をサポートしていません!心配しないで、私たちが強制的にサポートしてあげましょう(^^)

    Excel VBA Regex関数による文字列のマッチング

    見出しから明らかなように、Excelで正規表現を使うためには、自分で関数を作る必要があります。 幸い、ExcelのVBAには レジエクスプ オブジェクトを作成し、それをコードで使用することができます。

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant '結果を格納する配列 Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'ソース範囲内の現在の行インデックス、ソース範囲の現在の列インデックス、行カウント、列カウント On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErrr(xlErrValue) End Function

    このコードをVBAエディタに貼り付けると、新しい RegExpMatch VBAにあまり慣れていない方は、「ExcelにVBAコードを挿入する方法」が参考になります。

    注意:コードを挿入した後、忘れずにファイルを マクロ可能なワークブック (.xlsm)です。

    RegExpMatchの構文

    があります。 RegExpMatch 関数は、ソース文字列の一部が正規表現にマッチするかどうかを調べます。 結果はブール値で、少なくともひとつでもマッチすれば TRUE、そうでなければ FALSE となります。

    このカスタム関数には3つの引数があり、最初の2つは必須で、最後の1つはオプションです。

    RegExpMatch(テキスト、パターン、[match_case])

    どこで

    • テキスト (必須) - 検索する1つまたは複数の文字列。 セルまたは範囲の参照として提供することができます。
    • パターン (必須) - 一致させる正規表現。 数式内に直接配置する場合、パターンは二重引用符で囲む必要があります。
    • マッチケース (オプション) - マッチの種類を定義します。 TRUE あるいは省略した場合 (デフォルト)、大文字小文字を区別したマッチングが行われ、FALSE の場合は大文字小文字を区別しません。

    この機能は、Excel 365、Excel 2021、Excel 2019、Excel 2016、Excel 2013、Excel 2010のすべてのバージョンで使用できます。

    RegExpMatchについて知っておくべき3つのこと

    実用的な計算に入る前に、いくつかの専門的な事柄を明確にするために、以下の点にご注意ください。

    1. を処理することができる関数です。 単細胞 または セル範囲 後者の場合,この例のように,隣接するセルに動的な配列,あるいはスピルレンジの形で結果が返される.
    2. デフォルトでは、この関数は ケースセンシティブ 大文字小文字を区別しない場合は マッチケース VBA Regexpの制限により、大文字小文字を区別しないパターン(?i)はサポートされていません。
    3. 有効なパターンが見つからなかった場合,FALSE を返す。 パターンが無効 の場合、#VALUE!エラーが発生します。

    以下に、デモ用に作成された正規表現マッチの例をいくつか示します。 このパターンが、実際のワークシートのより広い範囲の入力データで問題なく動作することは保証できません。 実稼働する前に、必ずこのサンプルパターンをテストしてあなたのニーズに従って調整してください。

    Excelで正規表現を使って文字列をマッチングさせる方法

    マッチさせたい文字列がすべて同じパターンである場合、正規表現が理想的な解決策になります。

    ある商品に関するさまざまな情報を含むセル範囲(A5:A9)があるとします。 どのセルにSKUがあるかを知りたい場合、各SKUは大文字2文字、ハイフン、3桁からなると仮定すると、次の式で照合することができます。

    パターン : \b[A-Z]{2}-d{3} b

    ここで、[A-Z]{2}はAからZまでの任意の2つの大文字、 \d{3}は0から9までの任意の3桁の数字を意味します。

    パターンが確立されたので、計算式の記述に移ります。 基本的に、カスタム関数の使用はネイティブ関数と変わりません。 計算式を入力し始めるとすぐに、Excel のオートコンプリートが提案するリストに関数名が表示されます。 ただし、ダイナミックアレイ Excel (Microsoft 365 および Excel 2021) と従来の Excel (2019 および古いバージョン) にはいくつかのニュアンスの違いがあります。

    1つのセルに含まれる文字列にマッチ

    セル内の文字列にマッチさせるには、第1引数でそのセルを参照する。 第2引数には、正規表現を入れることになっている。

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    パターンは、絶対参照($A$2)でロックされた、あらかじめ定義されたセルに保持することも可能です。

    =RegExpMatch(A5, $A$2)

    最初のセルに数式を入力した後、他のすべての行にドラッグダウンすることができます。

    この方法は、以下のように美しく機能します。 すべてのExcelバージョン .

    複数のセル内の文字列を一度にマッチング

    複数の文字列を一つの数式でマッチングさせるには、最初の引数に範囲参照を含めます。

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    Excel 365 2021年エクセル 最初のセルに数式を入力してEnterキーを押すと、数式が自動的に下のセルに展開されます。

    エクセル2019 とそれ以前は、セル範囲に入力し、Ctrl + Shift + Enterキーを一緒に押すことで完了する、従来のCSE配列数式としてのみ機能します。

    番号にマッチする正規表現

    0から9までの任意の1桁の数字にマッチさせるには \d を追加したり、より複雑なパターンを作成したりすることができます。

    任意の数字にマッチする正規表現

    任意の長さの数字にマッチさせるには、/d文字の直後に+量記号を置く。これは、1桁以上の数字を含む数字を探すという意味である。

    パターン : \d+

    =RegExpMatch(A5:A9, "\d+")

    特定の長さの数字にマッチする正規表現

    特定の桁数を含む数値のマッチングを目的とする場合は、適当な量記号と一緒に \d を使用します。

    例えば、7桁ちょうどの請求書番号にマッチさせたい場合は、 \d{7} とします。 ただし、10桁や100桁の番号も含め、文字列中の7桁にマッチすることを念頭に置いてください。 もし、これと異なる場合は、両脇に単語境界線 \b を付けてください。

    パターン : \d{7} b

    =RegExpMatch(A5:A9, "\b\d{7}\b")

    電話番号の一致を表す正規表現

    電話番号はさまざまな形式で記述されるため、照合にはより高度な正規表現が必要となる。

    以下のデータセットでは、最初の2つのグループが3桁で、最後のグループが4桁である10桁の数字を検索する。 グループの区切りには、ピリオド、ハイフン、スペースを使用できる。 最初のグループは、括弧で囲んでもよいし、囲まないでよい。

    パターン: (⋈◍>◡<◍>◡<◍)。

    この正規表現を分解すると、次のようになる。

    • 前編( \d{3})
    • は、角括弧内の文字(ハイフン、ピリオド、空白)の出現回数が0回または1回であることを意味します。
    • 次に、3桁の数字d{3}の後に任意のハイフン、ピリオド、空白が続くグループがもう1つあります。
    • 最後の4桁の数字群 \d{4} の後に単語の境界線があり、電話番号が大きな数字の一部であることができないことを明確にしています。

    元の文字列をA5、正規表現をA2とすると、式は次のような形になる。

    =RegExpMatch(A5, $A$2)

    ...そして、期待通りに動作しています。

    注意事項

    • 国際コードのチェックは行っておりませんので、ある場合とない場合があります。
    • 正規表現では、スペース、タブ、キャリッジリターン、改行などの空白文字を表します。 スペースだけを許可するには、[-︎.sec]ではなく、[-︎.sec]を使用します。
    • 文字にマッチしない正規表現

      特定の文字を含まない文字列を見つけるには、否定文字クラス [^ ] を使用します。 これは、括弧内にないものにマッチします。例えば

      • [^13]は、1または3でない任意の1文字にマッチします。
      • [1-3] は、1、2、3 以外の任意の一文字 (すなわち、1 から 3 までの任意の数字) にマッチします。

      電話番号のリストから、国番号のないものを探したいとします。 国際コードには+記号が含まれることを念頭に置き、[^+]文字クラスを使って+記号のない文字列を探します。 ここで重要なのは、+以外の1文字にもマッチすることです。 電話番号は文字列中のどこにでもあるため、+以外の文字にはマッチしません。また、先頭の^と末尾の$は、文字列全体を処理するためのアンカーである。 その結果、「文字列のどの位置でも+文字にマッチしない」という正規表現が以下のように得られる。

      パターン : ^[^\+]*$

      =RegExpMatch(A5, "^[^+]*$")

      文字列にマッチしない正規表現

      特定の文字列にマッチしない場合の特別な正規表現構文はありませんが、負の先読みを使用することでこの動作をエミュレートすることができます。

      という文字列を探したいとします。 含まれない この正規表現がうまく機能します。

      パターン : ^(?!レモン).)*$.

      ここで説明が必要なのは、負のルックアヘッド(?!lemon)は、前方に "lemon "という単語がないかどうか右側を調べ、"lemon "がない場合は、ドットは改行以外の任意の文字にマッチする。 上記の式は、たった一度のチェックで、^で固定した文字列の先頭から*で固定した文字列の最後までに0回以上繰り返す定量子で、そのチェックに成功しているのである。$.

      テキストの大文字小文字を無視するために、第3引数にFALSEを設定して、大文字小文字を区別しない関数にしています。

      =RegExpMatch(A5, $A$2, FALSE)

      ヒントと注意点

      • 上記の正規表現が機能するのは 単線 複数行の文字列の場合、^ と $ は入力文字列の先頭と末尾ではなく、各行の先頭と末尾にマッチするため、 正規表現は最初の行だけを検索します。
      • という文字列にマッチするように 立ち上げない 某文章付き のような正規表現を使用します。
      • という文字列にマッチするように はてしない 某文章付き の場合、終了文字列のアンカーを検索パターンに含める: ^((?!lemons$).)*$.

      大文字・小文字を区別しないマッチング

      古典的な正規表現では、大文字小文字を区別しないマッチングのための特別なパターン (?i) がありますが、VBA RegExp ではサポートされていません。 この制限を克服するために、このカスタム関数では、3番目のオプション引数である マッチケース 大文字・小文字を区別しないマッチングを行うには、FALSEを指定します。

      例えば、1-Mar-22 や 01-MAR-2022 のような日付を識別したい場合、その日付に一致するように dd-mmm-yyyy ドムドム 形式の場合、以下の正規表現を使用しています。

      パターン : \d{1,2}-(Jan.

      1桁または2桁の数字の後にハイフンを付け、その後に月別の略語のいずれかを区切ったものを検索します。

      もっとシンプルなパターン、例えば \d{1,2}-[A-Za-z]{3}-the\d{2,4}b を使ってはどうですか? 01-ABC-2020 のような偽陽性マッチを防ぐためです。

      A2にパターンを入力すると、次のような式が得られます。

      =RegExpMatch(A5, $A$2, FALSE)

      有効な電子メールアドレスにマッチする正規表現

      一般に知られているように、電子メールアドレスは、ユーザー名、@記号、ドメイン名(メールサーバー)、トップレベルドメイン(.com, .edu, .org など)の4つの部分で構成されています。 電子メールアドレスの妥当性をチェックするには、正規表現を用いて上記の構造を複製する必要があります。

      パターン : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b

      この内容を理解するために、各パーツを詳しく見ていきましょう。

      • ユーザー名 はアルファベット、数字、アンダースコア、ドット、ハイフンを含むことができます。 \w はアルファベット、数字、アンダースコアのいずれにもマッチするので、次の正規表現が得られます: [\w.\-]+.
      • ドメイン名 は大文字、小文字、数字、ハイフン(ただし、最初と最後の位置は不可)、ドット(サブドメインの場合)が使用できます。 アンダースコアは使用できないため、[A-Za-z0-9]+[A-Za-z0-9. \-]*[A-Za-z0-9]+ という3種類の文字セットで使用されます。
      • トップレベルドメイン ドットに続く大文字と小文字からなり、2文字から24文字まで(現存する最長TLD)含むことができます: \.[A-Za-z]{2,24}.

      注:このパターンは、ドメイン名に2文字以上の英数字が含まれていることを想定しています。

      原文をA5、パターンをA5とすると、計算式はこのような形になる。

      =RegExpMatch(A5, $A$2)

      また、よりシンプルな正規表現を使用して、小文字と大文字のどちらかの文字セットで電子メールの検証を行うこともできます。

      パターン : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

      ただし、数式は大文字と小文字を区別しないようにしてください。

      =RegExpMatch(A5, $A$2, FALSE)

      正規表現にマッチしたExcelのIF式

      組み込み関数とカスタム関数は相性が良いので、1つの数式で一緒に使うことを妨げるものはありません。

      正規表現にマッチした場合に何かを返し、マッチしなかった場合に別の何かを計算するには、カスタムRegExpMatch関数をIFの論理テキストに埋め込みます。

      IF(RegExpMatch(...), [値_if_true], [値_if_false])

      例えば、A5の文字列に有効な電子メールアドレスが含まれていれば "Yes"、そうでなければ "No "を返すことができる。

      =IF(RegExpMatch(A5, $A$2,), "はい", "いいえ")

      正規表現にマッチした場合の回数

      Excelのネイティブ関数は正規表現をサポートしていないので、COUNTISやCOUNTIFS関数に直接正規表現を入れることはできません。 幸いにも、カスタム関数を使えば、この機能をエミュレートすることができます。

      電話番号を含むセルの数を知るには、B5:B9 の TRUE 値を数えればよいのです。 これは、標準の COUNTIF 式を使えば簡単に実行できます。

      =countif(b5:b9, true)

      ワークシートに余分な列を作りたくない場合は、このカスタム関数が一度に複数のセルを処理できることと、ExcelのSUMが配列内の値を合計できることを念頭に置いて、以下のようにします。

      • RegExpMatchに範囲参照を与え、TRUEとFALSEの値の配列を返すようにします。
      • 二重否定(--)を使用して、論理値を1と0に強制する。
      • SUM関数で、結果の配列の1と0を足し算するようにします。

      =SUM(--RegExpMatch(A5:A9, $A$2))

      Ultimate Suiteによる正規表現マッチング

      Ultimate Suiteのユーザーは、アドインのインストール中にExcelにスムーズに統合されるため、ワークブックにVBAコードを追加することなく、4つの強力なRegex関数を活用できます。 弊社のカスタム関数は、標準の.NET RegExエンジンで処理され、フル機能のクラシックな正規表現に対応しています。

      カスタムRegexMatch関数の使用方法

      Ultimate Suiteの最新版(2021.4以降)がインストールされていると仮定すると、簡単な2ステップでRengex Match式を作成することができます。

      1. について エイブルビットのデータ タブで テキスト グループをクリックします。 Regex ツール .

    • について Regexツール ペインで、次の操作を行います。
      • ソースとなる文字列を選択します。
      • パターンを入力します。
      • を選んでください。 マッチ オプションを使用します。
      • 結果を値ではなく、数式で表示するには 数式として挿入する のチェックボックスにチェックを入れます。
      • をクリックします。 マッチ ボタンをクリックします。

      暫くして、その AblebitsRegexMatch 関数は、データの右側にある新しい列に挿入されます。

      以下のスクリーンショットでは、A列の文字列が7桁の数字を含んでいるかどうかをチェックしています。

      ヒント

      • この機能は てんぷ 直接細胞内 標準によって インサート機能 の下に分類されるダイアログボックスです。 AblebitsUDFs .
      • デフォルトでは、正規表現は数式に追加されますが、別のセルに保持することもできます。 その場合は、第2引数にセル参照を使用するだけです。
      • デフォルトでは、この関数は ケースセンシティブ 大文字と小文字を区別しないマッチングを行う場合は、(?i)パターンを使用します。

      詳しくは、AblebitsRegexMatch関数をご覧ください。

      以上、エクセルで正規表現マッチングを行う方法でした。 読んでいただきありがとうございました!来週のブログでお会いできるのを楽しみにしています。

      ダウンロード可能なもの

      Excel Regex Match の例 (.xlsm ファイル)

      Ultimate Suite 14日間フル機能版(.exeファイル)

    Michael Brown は、ソフトウェア ツールを使用して複雑なプロセスを簡素化することに情熱を注ぐ熱心なテクノロジー愛好家です。テクノロジー業界で 10 年以上の経験があり、Microsoft Excel と Outlook、さらに Google Sheets と Docs のスキルを磨いてきました。 Michael のブログは、彼の知識と専門知識を他の人と共有することに特化しており、生産性と効率を向上させるためのわかりやすいヒントとチュートリアルを提供しています。経験豊富なプロフェッショナルであろうと初心者であろうと、Michael のブログでは、これらの重要なソフトウェア ツールを最大限に活用するための貴重な洞察と実践的なアドバイスを提供しています。