目次
Excelの数式で正規表現がサポートされていないのはなぜでしょうか? 今ならサポートされています :) カスタム関数を使えば、特定のパターンに一致する文字列を簡単に検索、置換、抽出、削除することができます。
一見したところ、Excelにはテキスト文字列の操作に必要なものがすべて揃っているように見えます。 しかし、正規表現はどうでしょうか? おっと、Excelには組み込みの正規表現関数がありません。 しかし、自分で作れないとは誰も言いません :)
正規表現とは何ですか?
正規表現(別名 レジェックス または レジェックスプ は、検索パターンを定義する特別にエンコードされた文字列です。 そのパターンを使って、文字列の中から一致する文字の組み合わせを見つけたり、データ入力を検証したりできます。 もしワイルドカード表記に慣れているなら、正規表現をワイルドカードの高度版と考えることができます。
正規表現は、特殊文字、演算子、構成要素からなる独自の構文を持っています。 例えば、[0-5]は0から5までの任意の一桁の数字にマッチします。
正規表現はJavaScriptやVBAを含む多くのプログラミング言語で使用されています。 後者には特別なRegExpオブジェクトがあり、カスタム関数を作成するために利用します。
Excelは正規表現に対応していますか?
残念ながら、Excelには正規表現関数が組み込まれていません。 数式に正規表現を使用するには、独自のユーザー定義関数(VBAまたは.NETベース)を作成するか、正規表現をサポートするサードパーティツールをインストールする必要があります。
Excel Regexチートシート
正規表現が非常にシンプルであろうと、非常に高度であろうと、共通の構文を使って構築されます。 このチュートリアルは正規表現を教えることを目的としていません。 これについては、初心者向けの無料のチュートリアルから上級者向けのプレミアムコースまで、多くのリソースがオンライン上にあります。
以下に、RegExの基本的なパターンを把握するのに役立つクイックリファレンスを提供します。 また、さらなる例を学習する際のチートシートとしても利用できます。
正規表現に慣れている人は、RegExp関数にすぐに飛びつくことができます。
キャラクター
これらは、特定の文字にマッチするために最も頻繁に使用されるパターンです。
パターン | 商品説明 | 例 | マッチ |
. | ワイルドカード文字:改行以外の任意の1文字にマッチします。 | .ot | ドット , 熱め , 鉢 , オット |
\d | 数字文字:0から9までの任意の1桁の数字 | \d | で a1b マッチ 1 |
\D | 数字以外の文字 | \D | で a1b マッチ a と b |
\s | 空白文字:スペース、タブ、改行、キャリッジリターン | .\s. | で 3セント マッチ 3 c |
\S | 空白でない任意の文字 | \S+ | で 30セント マッチ 30 と セント |
\w | ワード文字:ASCII文字、数字、アンダースコアのいずれか。 | \w+ | で 5_cats***さん マッチ 5_猫 |
\W | 英数字およびアンダースコア以外のすべての文字 | \W+ | で 5_cats***さん マッチ *** |
\t | タブ | ||
\n | 新ライン | \nd+ | 以下の2行の文字列のうち、マッチ10 猫5匹 犬10匹 |
\ | 文字の特別な意味をエスケープし、検索できるようにする | \. \w+\. | ピリオドをエスケープして、文字列中のリテラル文字 "." を見つけることができます。 さん , さん , 教授 |
キャラクタークラス
これらのパターンを使用すると、異なる文字セットの要素にマッチさせることができます。
パターン | 商品説明 | 例 | マッチ |
[登場人物]。 | 括弧内の任意の1文字にマッチする | d[oi]g | ドッグ と 掘る |
[^文字]。 | 括弧内にない任意の1文字にマッチする | d[^oi]g | マッチ ダグ、ダグ , d1g 一致しない ドッグ と 掘る |
[from-to]です。 | で囲まれた範囲内の任意の文字にマッチする。 | [0-9] [a-z] [A-Z] | 0~9の任意の1桁 任意の小文字1文字 任意の大文字1文字 |
量子化装置
数量詞は、マッチする文字の数を指定する特殊な式です。 数量詞は、常にその前の文字に適用されます。
パターン | 商品説明 | 例 | マッチ |
* | 発生回数が0回以上 | 1a* | 1, 1a , 1aa、1aaa など。 |
+ | 1回以上発生した場合 | ポプラス | で 鉢 マッチ ポ で 貧弱 マッチ うんち |
? | 0回または1回発生 | ローアイド | ロード、ロッド |
*? | 発生回数が0回以上、なるべく少ないもの | 1a*? | で 1a , ワンエー と ワンアアアアアアアアアアアアアアアアアアアアアアアアア マッチ 1a |
+? | 1回以上発生するが、できるだけ少なくする。 | po+? | で 鉢 と 貧弱 マッチ ポ |
?? | 発生回数が0回または1回、ただし、できるだけ少ないこと。 | ろあ? | で 道 と 竿 マッチ ロー |
{n} | 直前のパターンにn回マッチする | \d{3} | ちょうど3桁 |
{n,} | 直前のパターンにn回以上マッチする | \d{3,} | 3桁以上 |
{n,m} | 先行するパターンにn回からm回までマッチする | \d{3,5} | 3桁から5桁まで |
グループ化
グループ化構造は、ソース文字列から部分文字列をキャプチャし、それを使って何らかの操作を行うために使用されます。
シンタックス | 商品説明 | 例 | マッチ |
雛形 | 捕捉グループ:一致する部分文字列を捕捉し、序数を割り当てる | (\d+) | で 猫5匹、犬10匹 キャプチャ 5 (グループ1)と 10 (グループ2) |
(?:パターン) | 非捕獲グループ:グループにマッチするが、捕獲はしない | (⋈◍>◡<◍>◡<◍)。 | で 猫5匹、犬10匹 キャプチャ 10 |
\1 | グループ1の内容 | (\d+)\+(\d+)=2+1 | 5+10=10+5と一致 をキャプチャします。 5 と 10 であり、捕獲群に含まれる |
\2 | グループ2の内容 |
アンカー
アンカーは、入力文字列の中で一致するものを探す位置を指定する。
アンカー | 商品説明 | 例 | マッチ |
^ | 文字列の先頭 注:[^inside brackets]は "not "を意味する。 | ^\d+ | 文字列の先頭の任意の桁数。 で 猫5匹、犬10匹 マッチ 5 |
$ | 文字列の末尾 | \d+$ | 文字列の末尾の任意の桁数。 で 10+5で15 マッチ 15 |
\b | ワードバウンダリ | \ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ | マッチ 喜び を別の単語として使用することはできませんが たのしい . |
\B | NOTワードバウンダリー | \ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ | マッチ 喜び において たのしい が、独立した単語としてではなく |
オルタネート(OR)構成
alternationオペランドはOR論理を有効にするので、この要素かあの要素のどちらかにマッチします。
構成 | 商品説明 | 例 | マッチ |
縦棒で区切られた任意の1要素にマッチする | (s | で 貝殻を売っている。 試合 販売 と 貝殻 |
ルックアラウンド
ルックアラウンド構文は、何か他のものの後や前にあるものにマッチさせたいときに便利です。 これらの式は、実際の文字ではなく位置にマッチするため、「ゼロ幅のアサーション」または「ゼロ幅のマッチ」と呼ばれることがあります。
注)VBA RegExフレーバーでは、ルックビジョンはサポートされていません。
パターン | 商品説明 | 例 | マッチ |
(?=) | ポジティブ・ルックアヘッド | X(?=Y) | 式Xの後にYが続く場合(Xの前にYがある場合)にマッチする。 |
(?!) | ネガティヴ・ルックアヘッド | X(?!Y) | 式 X の後に Y が続かない場合にマッチする。 |
(?<=) | ポジティブ・ルックビハインド | (?<=Y)X | 式Xの前にYがある場合(つまり、Xの後ろにYがある場合)にマッチする。 |
(? )</td | ネガティヴ・ルックビハインド | (? Y)X</td | 式Xの前にYがない場合にマッチする。 |
さて、基本的なことはわかったので、次は最も興味深い部分である、実際のデータで正規表現を使って文字列を解析し、必要な情報を見つけよう。 構文についてもっと詳しく知りたい場合は、Microsoftの正規表現言語に関するガイドが役に立つだろう。
ExcelのカスタムRegEx関数
すでに述べたように、Microsoft ExcelにはRegEx関数が組み込まれていません。 正規表現を有効にするために、3つのカスタムVBA関数(別名、ユーザー定義関数)を作成しました。 以下のリンク先のページまたはサンプルワークブックからコードをコピーし、自分のExcelファイルに貼り付けることができます。
VBA RegExp関数の仕組み
このセクションでは、内部機構について説明します。バックエンドで何が起こっているのかを正確に知りたい方には興味深い内容かもしれません。
VBAで正規表現を使い始めるには、RegExオブジェクト参照ライブラリを有効にするか、CreateObject関数を使用する必要があります。 VBAエディタで参照を設定する手間を省くために、後者の方法を選択しました。
RegExpオブジェクトは、4つのプロパティを持ちます。
- パターン - は 雛形 を入力文字列にマッチさせる。
- グローバル - は,入力文字列中のすべてのマッチを検索するか,あるいは最初のマッチだけを検索するかを制御します。 この関数では,これを True に設定すると オールマッチ .
- マルチライン - は,複数行の文字列の改行をまたいでパターンをマッチさせるか, それとも最初の行だけでマッチさせるかを決める。 このコードでは,Trueを指定して 一行一行 .
- IgnoreCase - は、正規表現が大文字小文字を区別するか (デフォルト) あるいは区別しないか (True に設定) を定義します。 この場合、オプションで設定した マッチケース デフォルトでは、すべての関数が ケースセンシティブ .
VBA RegExpの制限
Excel VBAは基本的な正規表現パターンを実装していますが、.NET、Perl、Java、その他の正規表現エンジンで利用できる多くの高度な機能がありません。 例えば、VBAのRegExpは大文字小文字を区別しないマッチングのための(?i)、複数行モードのための(?m)などのインライン修飾子、ルックビジョン、POSIXクラスなど、いくつか挙げられますが、これらをサポートしていません。
Excel Regex Match関数
があります。 RegExpMatch 関数は、入力文字列から正規表現にマッチするテキストを検索し、マッチした場合に TRUE、そうでない場合に FALSE を返します。
RegExpMatch(テキスト、パターン、[match_case])どこで
- テキスト (必須) - 検索する1つまたは複数の文字列。
- パターン (必須) - 一致させる正規表現。
- マッチケース (オプション) - マッチタイプ。 TRUEまたは省略 - 大文字小文字を区別する、FALSE - 大文字小文字を区別しない。
この関数のコードはこちらです。
例:正規表現を使って文字列をマッチングさせる方法
以下のデータセットで、SKUコードを含むエントリーを識別したいとします。
各SKUが2つの大文字から始まり、ハイフンが続き、4桁の数字が続くとすると、以下の式で照合することができます。
パターン : \b[A-Z]{2}-d{4} b
ここで、[A-Z]{2}はAからZまでの任意の2文字の大文字、 \d{4}は0から9までの任意の4桁を意味します。 単語境界 \b は、SKUが大きな文字列に含まれておらず、別の単語であることを示します。
このパターンが確立された状態で、いつものように数式を入力し始めると、Excelのオートコンプリートが提案するリストの中に関数の名前が表示されます。
元の文字列がA5にあると仮定すると、計算式は次のようになる。
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
便宜上、別のセルに正規表現を入力し、絶対参照($A$2)を使って 雛形 これにより、数式を他のセルにコピーしても、セルのアドレスが変更されることはありません。
=RegExpMatch(A5, $A$2)
TRUEやFALSEの代わりに独自のテキストラベルを表示するには、IF関数でRegExpMatchをネストし、必要なテキストを value_if_true と value_if_false の引数になります。
=IF(RegExpMatch(A5, $A$2), "Yes", "No")
その他の数式例については、こちらをご覧ください。
- 正規表現を使った文字列のマッチング方法
- 正規表現によるExcelデータの検証
Excel Regex Extract関数
があります。 RegExpExtract は,正規表現にマッチする部分文字列を検索し,すべてのマッチまたは特定のマッチを抽出する関数である。
RegExpExtract(text, pattern, [instance_num], [match_case])どこで
- テキスト (必須) - 検索するためのテキスト文字列です。
- パターン (必須) - 一致させる正規表現。
- インスタンス番号 (オプション) - 抽出するインスタンスを示す通し番号。 省略した場合は、見つかったすべてのマッチを返します (デフォルト)。
- マッチケース (オプション) - テキストの大文字小文字を一致させるか (TRUEまたは省略) あるいは無視するか (FALSE)を定義します。
この関数のコードは、こちらから入手できます。
例:正規表現で文字列を抽出する方法
ここでは、7桁の数字にマッチする非常にシンプルな正規表現を使用し、請求書番号を抽出してみましょう。
パターン : \d{7} b
A2にパターンを入れれば、コンパクトで上品な仕上がりになります。
=RegExpExtract(A5, $A$2)
パターンにマッチした場合、式は請求書番号を抽出し、マッチしなかった場合は何も返さない。
その他の例については、「Excelで正規表現を使って文字列を抽出する方法」を参照してください。
Excel Regex Replace関数
があります。 RegExpReplace は、正規表現にマッチする値を指定されたテキストに置き換える関数です。
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])どこで
- テキスト (必須) - 検索するためのテキスト文字列です。
- パターン (必須) - 一致させる正規表現。
- 交換 (必須) - 一致する部分文字列を置換するためのテキストです。
- インスタンス番号 (オプション) - 置換するインスタンス。 デフォルトは "all matches" です。
- マッチケース (オプション) - テキストの大文字小文字を一致させるか (TRUEあるいは省略) あるいは無視するか (FALSE)を制御します。
本機能のコードはこちらで公開しています。
例:正規表現を使って文字列を置換・削除する方法
当社の記録の中には、クレジットカード番号が含まれているものがあります。 この情報は機密情報であり、何かに置き換えたり、完全に削除したい場合があります。 どちらの作業も RegExpReplace 2番目のシナリオでは、空の文字列に置き換えます。
この例では、カード番号はすべて16桁で、スペースで区切られた4つのグループに分かれている。 これを見つけるために、この正規表現を用いてパターンを複製する。
パターン : \b.
置き換えには、以下の文字列を使用します。
交換 : xxxx xxxx xxxx xxxx xxxx
そして、ここに完全な公式があります。 取り替える クレジットカード番号に機密情報が含まれる
=RegExpReplace(A5, "\b ³³", "XXXX XXXX XXXX³")
正規表現と置換テキストを別々のセル(A2 と B2)に配置しても、この数式は同様に機能します。
Excelでは、「削除」は「置換」の特殊なケースです。 取り除く クレジットカード番号の場合は、空文字列("")を使用します。 かけかえ の議論になります。
=RegExpReplace(A5, "ⒶⒶⒷ", "")
ヒント: 結果に含まれる空行を取り除くには、この例のように別の RegExpReplace 関数を使用します: 正規表現を使用して空行を削除する方法。
詳しくは、こちらをご覧ください。
- Excelで正規表現を使って文字列を置換する方法
- 正規表現による文字列の削除方法
- 正規表現で空白を消す方法
部分文字列のマッチング、抽出、置換、削除を行うための正規表現ツール
Ultimate Suiteのユーザーは、ワークブックに一行のコードを挿入することなく、正規表現のすべての力を得ることができます。 必要なコードはすべて当社の開発者によって書かれ、インストール中にあなたのExcelにスムーズに統合されます。
Ultimate Suiteの機能は、前述したVBAの機能とは異なり、.NETベースであるため、主に2つの利点があります。
- VBAのコードを追加したり、マクロ対応ファイルとして保存することなく、通常の.xlsxワークブックで正規表現を使用することができます。
- .NET Regex エンジンは、フル機能の古典的な正規表現をサポートしており、より洗練されたパターンを構築することができます。
エクセルで正規表現を使う方法
Ultimate Suiteをインストールすれば、Excelで正規表現を使うのは、次の2ステップで簡単になります。
- について エイブルビットのデータ タブで テキスト グループをクリックします。 Regexツール .
- について Regexツール ペインで、次の操作を行います。
- ソースデータを選択します。
- 正規表現パターンを入力します。
- 希望するオプションを選択します。 マッチ , 抜粋 , 削除 または 交換 .
- 結果を値ではなく、数式で取得する場合は 数式として挿入する のチェックボックスにチェックを入れます。
- アクションボタンを押す
例えば、セルA2:A6からクレジットカード番号を削除する場合、以下のように設定します。
あっという間に、元のデータの右側の新しい列にAblebitsRegex関数が挿入されます。 今回の場合、計算式は
=AblebitsRegexRemove(A2, "ⒶⒶⒷ")
一度作成した数式は、他のネイティブな数式と同様に編集、コピー、移動が可能です。
セルに直接 Regex 式を挿入する方法
AblebitsRegex関数は、アドインのインターフェースを使用せずに、セルに直接挿入することもできます。 その方法は次のとおりです。
- をクリックします。 エフエックス ボタンをクリックするか、フォーミュラバーの インサート機能 について 計算式 タブで表示します。
- での インサート機能 ダイアログボックスで AblebitsUDFs カテゴリから目的の機能を選択し、OKをクリックします。
- 通常通り、関数の引数を定義して、OKをクリックします。 完了です。
詳しくは、「Excelの正規表現ツール」をご覧ください。
以上、正規表現を使ってExcelのセル内のテキストをマッチング、抽出、置換、削除する方法でした。 読んでいただきありがとうございました!来週のブログでお会いできるのを楽しみにしています。
ダウンロード可能なもの
Excel Regex - 数式の例 (.xlsm ファイル)
Ultimate Suite - 体験版 (.exeファイル)