検索
連載

【Excel新関数】難問「表記ゆれ」を秒で解決。正規表現関数の基本と実践レシピTech TIPS

Excelでのデータ整形は、これまで多くのユーザーを悩ませてきた。全角と半角の混在や不規則な文字列の掃除には、複雑な関数の組み合わせやVBAが不可欠だったからだ。しかし、「正規表現関数」の登場により、その作業が劇的に容易になった。本Tech TIPSでは、実務を効率化する正規表現(Regex)関数の基本と活用法を解説する。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「Tech TIPS」のインデックス

連載目次

対象:Excel 365


正規表現関数の基本と実践レシピ
正規表現関数の基本と実践レシピ
Excelでのデータ整形は、これまで多くのユーザーを悩ませてきた。全角と半角の混在や不規則な文字列の掃除には、複雑な関数の組み合わせやVBAが不可欠だったからだ。しかし、「正規表現関数」の登場により、その作業が劇的に容易になった。本Tech TIPSでは、実務を効率化する正規表現(Regex)関数の基本と活用法を解説する。

 「Microsoft Excel(エクセル)」を使った作業で特に厄介なのが「不ぞろいな文字列の掃除」である。特に日本語では全角と半角があり、スペースの全角と半角や「-」と「−」いったフォントによっては見分けがつきにくいものもある。こうした文字が混在した表では、オートフィルターやFILTER関数で正しくデータが抽出できないという問題がある。

 事前に住所から郵便番号だけを抜く、氏名の間のスペースを統一する、システムから吐き出されたごみ混じりのデータを整形する、といった作業がどうしても必要になってしまう。これまでは、LEFT、RIGHT、SUBSTITUTEといった関数を複雑に組み合わせるか、VBAを使うしかなかった。

 しかし、Microsoft 365(Excel 365)の2024年以降のアップデートで順次ロールアウトされた「正規表現(Regex)関数」を使うことで、上述したデータの整形作業を簡略化できるようになった(法人向けのExcel 365では展開されていない可能性もあるので注意してほしい)。本Tech TIPSでは、新しい正規表現関数について解説する。

 なお、以下で例示している正規表現は、分かりやすくするために、なるべく簡単に表記できるパターンにしている。そのためメールアドレスや電話番号、郵便番号などを「厳密」に判定しているわけではないことは留意していただきたい。

3つの新関数「REGEXTEST」「REGEXEXTRACT」「REGEXREPLACE」

 正規表現とは、特定の文字そのものではなく、「数字3桁」「行の先頭にある文字」といった「パターン」で検索や操作をする手法だ(正規表現については後述)。Excelに導入されたのが、3つの関数「REGEXTEST」「REGEXEXTRACT」「REGEXREPLACE」である。

入力データの整合性を確認する「REGEXTEST」

 入力された値がメールアドレスの形式をおおよそ満たしているか、あるいは電話番号の桁数が正しいかなどを判定するのに使えるのが、「REGEXTEST」関数だ。

 第1引数の文字列に、第2引数で指定した正規表現と合致するものがある場合は「TRUE」、含まれていない場合は「FALSE」を返す。

=REGEXTEST(文字列, 正規表現, [大文字・小文字の区別])


REGEXTEST関数を基本構文
[大文字・小文字の区別]は省略可能で、「1」の場合は大文字と小文字を区別しない、「0」または省略は区別する。

 例えば、入力されたメールアドレスがおおよそ「半角英数字+@+半角英数字.半角英数字」の形式になっているかどうかを確認するような場合に利用できる。

REGEXTEST関数で正規表現との合致をチェックする
REGEXTEST関数で正規表現との合致をチェックする
REGEXTEST関数は、入力されたメールアドレスがおおよそ「半角英数字+@+半角英数字.半角英数字」の形式になっているかどうかを確認するような場合に使える。

 ここで示した数式はかなりシンプルに判別するもので、全角文字が混じっていても「TRUE」になってしまうので注意してほしい。より正確に判別したい場合は、以下のようなより複雑な正規表現を使う必要がある点に注意してほしい。

=REGEXTEST(A2, "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")


REGEXTEST関数で少し正確にメールアドレスの形式になっているかどうかを判別する数式

必要な情報を正確に抽出する「REGEXEXTRACT」

 REGEXTEST関数は、文字列内に正規表現で指定したパターンが含まれているかどうかを判定するのに対し、REGEXEXTRACT関数はパターンに合致する部分を抽出するのに利用する関数だ。

 第1引数の文字列に、第2引数で正規表現を指定してデータを抽出する。備考欄に混在する日付や金額など、抽出対象の出現位置が一定でないデータを取り出したい場合などに使える。

=REGEXEXTRACT(文字列, 正規表現, [戻り値モード], [大文字・小文字の区別])


REGEXEXTRACT関数を基本構文

引数 説明
文字列 文字列または抽出するテキストを含むセルへの参照
正規表現 抽出するテキストのパターンを記述する正規表現
戻り値モード 抽出する文字列を指定する数値
0または省略:正規表現に一致する最初の文字列を返す
1:正規表現に一致する全ての文字列を配列として返す
2:最初に一致した文字列から正規表現で「( )(括弧)」で囲んだグループを配列として返す
大文字・小文字の区別 大文字と小文字を区別させるかどうかを指定する
0または省略:大文字と小文字を区別する
1:大文字と小文字を区別しない
REGEXEXTRACT関数の引数

 例えば、不規則なテキストの中から、特定の形式(ここでは受注番号の「英字2桁+数字4桁」)だけを抜き出すような場合、第2引数に正規表現を書くことで、第1引数の文字列から受注番号だけを抜き出すことが可能だ。なお、第3引数(戻り値モード)に「1」を設定した場合、複数の結果が合致するとスピルによって隣接するセルに自動展開されるので注意してほしい。隣接セルに値が入っているとエラーになる。

REGEXEXTRACT関数で文字列から特定のパターンに合致するものを抽出する
REGEXEXTRACT関数で文字列から特定のパターンに合致するものを抽出する
REGEXEXTRACT関数は、不規則なテキストの中から特定のパターン(ここでは受注番号の「英字2桁+数字4桁」)だけを抜き出すような場合に利用する。

データのフォーマットを一括整形する「REGEXREPLACE」

 REGEXREPLACE関数は、正規表現で指定したパターンに合致した部分を別の文字列に置き換えるというものだ。正規表現が利用できるため、通常の置換機能では対応できない置換が数式で実行できる。

=REGEXREPLACE(文字列, 正規表現, 置換文字列, [操作対象], [大文字・小文字の区別])


REGEXREPLACE関数を基本構文

引数 説明
文字列 文字列または抽出するテキストを含むセルへの参照
正規表現 抽出するテキストのパターンを記述する正規表現
置換文字列 一致した部分を置き換える文字列。置換用の正規表現も指定可
操作対象 一致した部分が複数ある場合に、何番目を置き換えるかの指定。既定は「0」で全ての一致した部分を置き換える。負の数値の場合は末尾から検索
大文字・小文字の区別 大文字と小文字を区別させるかどうかを指定する
0または省略:大文字と小文字を区別する
1:大文字と小文字を区別しない
REGEXREPLACE関数の引数

 例えば、Excelで作成した顧客管理表内の電話番号に含まれるハイフンや括弧などの記号を削除したり、全角ハイフンを半角ハイフンに置き換えたり、といったことができる。

REGEXREPLACE関数で特定のパターンに合致した文字列を別の文字列に置換する
REGEXREPLACE関数で特定のパターンに合致した文字列を別の文字列に置換する
REGEXREPLACE関数は、顧客管理表内の電話番号に含まれるハイフンや括弧などの記号を削除したり、全角ハイフンを半角ハイフンに置き換えたり、といったことができる。

正規表現の基本記号と生成AIの活用術

 実務で頻用される正規表現で利用可能な主な記号を下表に整理する。

記号 意味 活用例
. 任意の1文字 伏せ字の検索など
\d 数字(0-9など) 金額や個数の抽出
\D 数字以外 名称や単位の抽出
\w 半角英数字とアンダースコア 半角文字の抽出
^ 先頭(行頭) 特定の単語で始まる項目の判定
$ 末尾(行末) 特定の拡張子を持つファイルの特定
[ ] 集合 [A-Z] で半角英大文字のみを指定
[^ ] 否定 [^0-9] で半角数字以外を全て削除
+ 1回以上の繰り返し 連続するスペースや数値の塊を捕捉
{n} n回の繰り返し \d{10,11} で電話番号の桁数を指定
正規表現関数で利用可能な主な記号
日本語環境のWindows OSでは、正規表現のメタ文字であるバックスラッシュが円記号で表示される。「\d」と「¥d」だと表示は異なるものの意味は同じだ。

 「\d+(複数の数字)」のような簡潔なものであれば、上表の記号を覚えればすぐに正規表現が記述できるだろう。しかし、複雑なパターンとなると自力で記述するのはハードルが高くなる。

 ChatGPTやCopilotなどの生成AI(人工知能)を活用することで、求める正規表現を効率的に得られる。

 例えば、生成AIに「ExcelのREGEXEXTRACT関数で使用する正規表現を教えてください。『東京都渋谷区1-2-3 建物名101』のような住所文字列から、末尾にある3桁の部屋番号のみを抽出したいです。」と入力すれば、以下のような回答が得られる(必要な部分のみ抜き出している)。

=REGEXEXTRACT(A1, "\d{3}$")


A1に「東京都渋谷区1-2-3 建物名101」が入っていれば、101が抽出されます。


生成AIを使った正規表現の生成例

 このように正規表現を覚えなくても、実は正規表現関数を使いこなすことが可能だ。

実務で使える正規表現関数の活用レシピ

 実務に使える活用例を紹介しよう。

REGEXEXTRACT関数を使って住所データから郵便番号を抽出

 例えば、名簿によって「〒」記号の有無や全角と半角の混在、前後に不要なスペースが含まれているといったケースがある。特に、手入力の住所録では全角の数字(123)で入力されていることもある。

 REGEXEXTRACT関数で数字クラス [0-90-9]と ハイフンの集合 [-−]を活用すれば、半角と全角のどちらの数字であっても「数字3桁-数字4桁」というパターンの正規表現で郵便番号を抽出できる。

=REGEXEXTRACT(A2, "[0-90-9]{3}[-−][0-90-9]{4}")


「数字3桁-数字4桁」を抽出する数式

REGEXEXTRACT関数を使って住所データから郵便番号を抽出する
REGEXEXTRACT関数を使って住所データから郵便番号を抽出する
REGEXEXTRACT関数で数字クラス [0-90-9]と ハイフンの集合 [-−]を活用すれば、半角と全角のどちらの数字であっても「数字3桁-数字4桁」というパターンの正規表現で郵便番号を抽出できる。

 出力結果を全て半角に統一するのであれば、ASC関数を使って以下のようにすればよい。

=ASC(REGEXEXTRACT(A2, "[0-90-9]{3}[-−][0-90-9]{4}"))


「数字3桁-数字4桁」を抽出して全て半角に変換する数式

REGEXEXTRACT関数で抽出したデータを半角に変換する
REGEXEXTRACT関数で抽出したデータを半角に変換する
抽出したデータに全角と半角が混在したような場合では、検索などに支障が出る。そこで、ASC関数を使って抽出したデータを半角に変換する。

REGEXREPLACE関数で氏名のスペースを統一

 全角と半角のスペースが混在したり、スペースが誤って複数入力されたりしていた場合、「半角スペース1つ」に統一する。通常の置換では何度も繰り返す必要がある作業も、正規表現の「繰り返し記号(+)」を使えば一度で整形できる。

=REGEXREPLACE(A2, "[  ]+", " ")


スペースを半角1つに整形する数式

REGEXREPLACE関数で氏名のスペースを統一する
REGEXREPLACE関数で氏名のスペースを統一する
住所録の氏名には、姓と名の間にスペースを入れて分けることも多い。ただ、スペースが半角であったり全角であったり、また半角が2つ入るような場合もある。このような場合でも、REGEXREPLACE関数を使えば簡単に半角スペースに統一できる。

REGEXEXTRACT関数のグループ化を利用した特定要素の取り出し

 REGEXEXTRACT関数では、パターンの中で「( )(括弧)」 を使用して特定の範囲を囲むことで、一致した全体ではなく「括弧内のみ」を抽出できる機能がある。例えば、「単価:1200円」や「定価:15000円」のように、先行する単語(キーワード)が複数ある場合でも、それらを検索の手掛かりにして、必要な数値部分だけを抜き出すことが可能だ。

 ただ、REGEXEXTRACT関数のグループ化を使って「単価:1200円」から数値だけを取得したい場合、一致した文字列全体(単価:1200)と数値(1200)がセットで出力(スピル)されてしまう。

 これを防ぎ、数値だけを表示させるために使用するのが「肯定的な後読み (?<=……)」という特殊記法である。これは「直前に指定した文字がある場合のみ一致させるが、その指定した文字自体は抽出結果に含めない」という命令だ。これにより、キーワードを「検索の目印」として使いつつ、純粋なデータ部分のみをスマートに抜き出すことが可能となる。

 以下のように記述すれば、「単価:(全角と半角のいずれかのコロン)」または「定価:(全角と半角のいずれかのコロン)」をキーワードにしつつ、続く数値を見つけ、数値と「,(カンマ)」のみを出力できる。

=REGEXEXTRACT(A2, "(?<=単価[::]|定価[::])\s*[0-9,]+")


価格の値のみを抽出する数式

REGEXEXTRACT関数のグループ化を利用して特定要素を取り出す
REGEXEXTRACT関数のグループ化を利用して特定要素を取り出す
REGEXEXTRACT関数のグループ化を使えば、「単価:(全角と半角のいずれかのコロン)」または「定価:(全角と半角のいずれかのコロン)」をキーワードにしつつ、続く数値を見つけ、数値と「,(カンマ)」のみを出力できる。

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る