2024年から、Excelに正規表現を扱う関数が3つ追加されました
これまで文字列を抜き出したり整えたりするのに、VBAでVBScriptのRegExpを呼んだり、LEFT・MID・FINDあたりを組み合わせて頑張ってたわけですが、それが関数1つで書けるようになったってことです
私自身、PythonでのスクレイピングやVBAでわりと正規表現を使ってきた側なんですが、Excelのセルにそのまま正規表現を書けるのは地味に助かるなと思ってます、別シートにマクロを仕込まなくても、関数だけで完結するのが大きいんですよね
この記事ではそのREGEXTEST・REGEXEXTRACT・REGEXREPLACEの3つについて、構文と引数、実際の数式の例、事務作業での使いどころをまとめていきます
ExcelのREGEX関数とは(使えるバージョンに注意)
ExcelのREGEX関数は、セルの中の文字列を正規表現でチェックしたり、抜き出したり、置き換えたりするための関数です、用意されてるのは次の3つ
| 関数 | やること | 戻り値 |
|---|---|---|
| REGEXTEST | パターンに一致するか判定する | TRUE / FALSE |
| REGEXEXTRACT | 一致した部分を抜き出す | テキスト |
| REGEXREPLACE | 一致した部分を置き換える | テキスト |
名前のとおり、TEST=判定、EXTRACT=抽出、REPLACE=置換という役割分担になっていて、この3つを覚えれば文字列処理のだいたいの場面はカバーできます
ただ1つ注意したいのが、使えるExcelが限られるという点です
REGEX関数が使えるのはMicrosoft 365(サブスク版)だけです、買い切りのExcel 2021やExcel 2024には入っていないので、その環境では使えません
2024年5月にプレビューとして登場して、その後Windows・Mac・Webの各Microsoft 365で正式に使えるようになりました、Insider(先行プレビュー版)への参加もいりません
自分のExcelがどっちか分からないときは、空いてるセルに=REGEXTEST("a","a")とでも打ってみてください、エラー(#NAME?)が出るなら、その環境にはまだREGEX関数が来てないってことになります
もう1つ、正規表現の方言(フレーバー)の話です、ExcelのREGEX関数はPCRE2という、多くのツールが採用しているフレーバーを使っています、後で出てくるVBAのVBScript RegExpとは細かい書き方が違う部分があるので、そこだけ頭の片隅に置いておくといいです
正規表現の基礎は別記事にまとめてあります
この記事はExcelのREGEX関数の使い方に集中したいので、正規表現そのものの基礎(メタ文字とか\d・\wといった定義済みパターン)はここでは説明しません
「\dって何だっけ」「[0-9]と[^0-9]の違いが曖昧」みたいな、記号の意味そのものがあやしい方は、先にこっちを読んでもらえると以降の数式がスッと入ってきます、郵便番号や電話番号などのよく使うパターンの早見表も載せてあります
正規表現の基本ルールは 正規表現とは?拒否反応が出る人向けに基本とよく使うパターンを整理 でまとめています、メタ文字の早見表・定義済みパターン・よく使うパターン集つきです
以下では、この記事に出てくるパターンに簡単な補足は添えますが、深い解説は上の記事にお任せして進めていきます
REGEXTEST(パターンに一致するか判定する)
まずは一番シンプルなREGEXTESTから、これは「セルの中身がパターンに一致するか?」をTRUE / FALSEで返してくれる関数です
=REGEXTEST(text, pattern, [case_sensitivity])| 引数 | 意味 |
|---|---|
| text | 調べたい文字列(セル参照でOK) |
| pattern | 正規表現のパターン |
| case_sensitivity | 省略可、0=大文字小文字を区別(既定)/ 1=区別しない |
ポイントは、textのどこか一部でもパターンに一致すればTRUEになるところです、全体がきっちり一致してる必要はありません
例えばA2セルに数字が含まれているか調べたいなら、こんな感じ
=REGEXTEST(A2,"[0-9]")A2セルに1個でも数字([0-9])があればTRUE、まったく無ければFALSEが返ります
メールアドレスっぽいかをざっくり判定したいなら、@が入ってるかどうかだけでも目印になります
=REGEXTEST(A2,"@")これはあくまで「@を含むか」の簡易チェックなので、ちゃんとしたメール形式かまで見たいなら後で出てくる抽出のパターンを応用する形になります
大文字小文字を区別したくないときは、3つ目の引数に1を渡します、例えば“abc”でも“ABC”でも引っかけたいケースですね
REGEXEXTRACT(一致した部分を抜き出す)
次は抜き出し担当のREGEXEXTRACTです、文字列の中からパターンに一致した部分だけを取り出してくれます、住所から郵便番号だけ、文章からメアドだけ、みたいな使い方ができます
=REGEXEXTRACT(text, pattern, [return_mode], [case_sensitivity])引数で重要なのが3つ目のreturn_modeで、これで「何を返すか」が変わります
| return_mode | 返すもの |
|---|---|
| 0(既定) | 最初に一致した1件 |
| 1 | 一致した全件を配列で(スピルして縦に並ぶ) |
| 2 | 最初に一致したキャプチャグループを配列で |
case_sensitivity(4つ目)はREGEXTESTと同じで、0=区別する(既定)/ 1=区別しない、です
郵便番号を抜き出す(return_mode 0)
A2セルに「東京都千代田区永田町1-7-1 100-8981」みたいな住所文字列が入っているとして、そこから郵便番号だけ取り出したいとします
=REGEXEXTRACT(A2,"\d{3}-\d{4}")\d{3}-\d{4}は「数字3つ・ハイフン・数字4つ」というパターンなので、100-8981の部分が抜き出されます、return_modeを省略してるので、最初に一致した1件だけが返る形です
メールアドレスを抜き出す(簡易版)
文章の中からメアドを抜きたいときは、こんなパターンが使えます
=REGEXEXTRACT(A2,"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")@の前後とドメイン部分をざっくり拾うパターンです、ただしこれはあくまで簡易版で、世の中のメアドの仕様を完全に網羅したものではありません、社内の名簿から拾うくらいの用途なら十分実用になります
数字のかたまりを全部抜き出す(return_mode 1)
1件だけじゃなくて、一致したもの全部が欲しいときはreturn_modeに1を渡します
=REGEXEXTRACT(A2,"\d+",1)\d+は「数字が1つ以上続くかたまり」なので、A2セルの中にある数字のかたまりが全部、縦にスピル(自動で複数セルに展開)して並びます、文字列に散らばった数値をまとめて拾いたいときに便利です
年・月・日に分解する(return_mode 2)
カッコ( )で囲った部分(キャプチャグループ)だけを取り出したいときはreturn_modeに2を渡します、日付を年・月・日にバラすのが分かりやすい例です
=REGEXEXTRACT("2024-05-20","(\d{4})-(\d{2})-(\d{2})",2)3つのグループ(\d{4})・(\d{2})・(\d{2})に分けてあるので、2024・05・20の3つが配列で返ります、横にスピルして年・月・日が別セルに並ぶイメージですね
REGEX関数の戻り値はテキスト(文字列)です、抜き出した郵便番号や数字をそのまま計算に使おうとすると文字列扱いでうまくいかないことがあるので、数値として使いたいときはVALUE関数で囲って数値に変換してください
例えば数字のかたまりを数値にしたいなら、=VALUE(REGEXEXTRACT(A2,"\d+"))のように包む形になります
REGEXREPLACE(一致した部分を置き換える)
3つ目は置換担当のREGEXREPLACEです、パターンに一致した部分を別の文字列に差し替えます、不要な文字を消したり、伏せ字にしたり、並べ替えたりできます
=REGEXREPLACE(text, pattern, replacement, [occurrence], [case_sensitivity])| 引数 | 意味 |
|---|---|
| text | 元の文字列 |
| pattern | 正規表現のパターン |
| replacement | 置き換え後の文字列($1 $2 でグループ参照できる) |
| occurrence | 省略可、0=全て置換(既定)/ 正のN=N番目だけ / 負の数=末尾から数える |
| case_sensitivity | 省略可、0=区別(既定)/ 1=区別しない |
数字だけ残して他を消す
電話番号などで、ハイフンやカッコが混ざってるのを取り払って数字だけにしたいときの定番がこれ
=REGEXREPLACE(A2,"[^0-9]","")[^0-9]は「数字以外の文字」という意味なので、それを空文字(””)に置き換える=数字以外を全部消す動きになります、occurrenceを省略すると既定で全部が対象です
電話番号の中央を伏せ字にする
個人情報を一覧で見せるときに、電話番号の真ん中をマスクしたいことがあります
=REGEXREPLACE("090-1234-5678","-\d{4}-","-****-")「ハイフン・数字4つ・ハイフン」の部分を「-****-」に置き換えてるので、結果は090-****-5678になります、真ん中の4桁だけ隠せるってわけです
姓名を並べ替える($1 $2 を使う)
replacementの中では$1・$2でキャプチャグループを参照できます、これを使うと並べ替えができます
=REGEXREPLACE("SoniaBrown","([A-Z][a-z]+)([A-Z][a-z]+)","$2, $1")1つ目のグループ(Sonia)を$1、2つ目(Brown)を$2として、「$2, $1」の順で並べ直しているので、結果はBrown, Soniaになります、姓・名の順番を入れ替えたいときなどに応用が利きます
実務での使いどころ
ここまでの3関数を、日々の事務作業に当てはめるとこんな使い方ができます、どれもさっきまでの数式の組み合わせで対応できる範囲です
| やりたいこと | 使う関数 | パターン例 |
|---|---|---|
| 住所から郵便番号を抜く | REGEXEXTRACT | \d{3}-\d{4} |
| 文章からメアドを拾う | REGEXEXTRACT | [A-Za-z0-9._%+-]+@… |
| 電話番号を数字だけに整形 | REGEXREPLACE | [^0-9] を “” に |
| 電話番号の中央をマスク | REGEXREPLACE | -\d{4}- を -****- に |
| 数字を含む行だけ判定 | REGEXTEST | [0-9] |
| メール形式かざっくり判定 | REGEXTEST | @ |
個人的にいいなと思うのは、表記ゆれのチェックや不要文字の除去みたいな、地味だけど件数が多いと面倒な作業がフィルや数式コピーでまとめて片付くところです、今までVBAでループ書いてた処理が、関数1行で済むケースがけっこうあります
REGEXTESTはTRUE / FALSEを返すので、IF関数やフィルター、条件付き書式と組み合わせると「このパターンに合う行だけ色を付ける」みたいなこともできて、チェック作業がはかどります
関連:XLOOKUP・XMATCHも正規表現に対応した
ちょっとした関連ネタとして、2024年12月にはXLOOKUPとXMATCHでも正規表現が使えるようになりました
具体的には、これらの関数の照合モードを表すmatch_mode引数に3を指定すると、検索値を正規表現として扱ってくれます、「完全一致じゃなくて、パターンに合う行を引っ張ってきたい」みたいな検索ができるようになるってことです
XLOOKUP・XMATCHの正規表現モードは、執筆時点ではプレビュー機能として提供されているものです、こちらもMicrosoft 365向けで、フレーバーはREGEX関数と同じPCRE2です、大事なブックでの常用は仕様が固まってからのほうが安心です
正規表現を覚えておくと、こうやって対応する関数が増えたときにそのまま流用できるので、文字列処理の引き出しとして持っておいて損はないなと感じてます
REGEX関数を使うときの注意点
便利な反面、使う前に押さえておきたいポイントもいくつかあります
- 使えるのはMicrosoft 365のみ、買い切りのExcel 2021 / 2024では使えない(共有相手の環境にも注意)
- 戻り値はテキスト、数値として扱うならVALUE関数で変換する
- フレーバーはPCRE2、VBAのVBScript RegExpとは細部の書き方が違う場合がある
- 大量データに複雑なパターンを当てると、再計算が重くなることがある
共有のところは特に見落としがちで、自分のPCでは動くのに、買い切り版のExcelを使ってる同僚が開いたら#NAME?エラーになる、というのが起こり得ます、配布するファイルで使うときは相手の環境も確認しておくと安心です
まとめ
ExcelのREGEX関数3つを振り返っておきます
- REGEXTEST…パターンに一致するかをTRUE / FALSEで判定
- REGEXEXTRACT…一致した部分を抜き出す(return_modeで最初の1件 / 全件 / グループを切替)
- REGEXREPLACE…一致した部分を置き換える($1 $2でグループ参照、occurrenceで対象を絞る)
Microsoft 365限定という条件はありますが、使える環境なら文字列処理がだいぶ楽になります、まずはREGEXTESTで判定から触ってみて、慣れてきたら抽出・置換に広げていくと取っつきやすいです
肝心の正規表現のパターンの作り方があやしいときは、メタ文字や定義済みパターンの基礎をまとめた 正規表現とは?拒否反応が出る人向けに基本とよく使うパターンを整理 を読んでみてください、そっちにはVBAで正規表現を使う実装例も載せてあるので、関数では物足りなくなってVBAに踏み込みたくなったときにも役立つと思います



コメント