REGEXREPLACE 関数


Excelに新しいワークシート関数が3つ追加されました。本稿執筆時点(2024/5/24)では、まだInSider Programに実装されただけですので、製品版で使えるようになるには、もう少し時間がかかると思います。今回追加されたのは、REGEXTEST関数、REGEXEXTRACT関数、REGEXREPLACE関数の3つです。関数名からも分かるように、いずれも正規表現に関する関数です。

正規表現とは

正規表現とは、検索や置換などで、検索する文字列を「パターン化して表す」手法です。たとえば、ある文章の中から「田中」または「田原」または「田崎」という3種類の文字列を探すとき、検索を3回繰り返すのではなく、これら3つの文字列を「"田"で始まる2文字の文字列」などのような"パターン"を指定することで、そのパターンに該当する文字列を探します。ExcelやWindowsに備わっているワイルドカード(*や?)を使った、いわゆる"あいまい検索"みたいなイメージですね。正規表現は、このワイルドカードよりも、はるかに詳細なパターンを指定できる、いわば「ワイルドカードの上位版」みたいな仕組みです。

ちなみに、正規表現は英語で「regular expression」と呼ばれることから、一般的に「Regex」と表されます。「Regex」の読み方は、人によってさまざまです。「りじぇっくす」と読む人もいますが、私は昔から「れぐいーえっくす」と読んでいます。MS-DOSの時代には「れぐいーえっくす」の方が多かった気がします。まぁ、好きに読んでください。

追加された関数

今回追加された関数は、次の3つです。

  • REGEXTEST関数
    元の文字列(テキスト)の中で、指定したパターンに一致する文字列が存在するときにTRUEを返し、存在しないときはFALSEを返します。
    (REGEXTEST関数の詳しい解説は、こちら)

  • REGEXEXTRACT関数
    元の文字列(テキスト)の中から、指定したパターンに一致する文字列を抽出します。
    (REGEXEXTRACT関数の詳しい解説は、こちら)

  • REGEXREPLACE関数
    元の文字列(テキスト)の中で、指定したパターンに一致する文字列を、別の文字列に置換します。

関数の引数

REGEXREPLACE関数の引数は、次のとおりです。

REGEXREPLACE(text, pattern, replacement, [occurrence], [case_sensitivity])
日本語で表すと
REGEXREPLACE(テキスト、パターン、置換、[出現]、[大文字と小文字の区別])

引数「テキスト」には、検索の元となる文字列や、その文字列が入力されているセルなどを指定します。引数「パターン」は、検索するパターンです。書き方は「REGEXTEST関数の解説」を参照してください。パターンに一致した文字列を、引数「置換」に指定した文字列に置換します。引数「出現」には、複数の文字列が見つかった場合、何番目に見つかった文字列を置換するかを指定します。省略可能です。詳しくは下記をご覧ください。最後の引数「大文字と小文字の区別」は省略可能です。アルファベットを検索するときに指定します。省略すると、アルファベットの大文字と小文字を区別して検索します。

使用例

パターンの書き方に関しては「REGEXTEST関数の解説」を参照してください。

まずは、簡単なやつから。

パターンに一致する文字列(ここでは、田で始まる2文字)を"鈴木"に置換しています。パターンに一致する文字列が存在しないと、REGEXREPLACE関数はエラーになりますので、何ならIFERROR関数を使ってください。

さて、3番目の引数「出現」ですが、指定したテキスト内で、もしパターンに一致した文字列が複数存在した場合、何番目の文字列を置換するかを指定します。

セルB2では、引数「出現」を指定していませんので、一致するすべての文字列が置換されます。セルB3では引数「出現」に2を指定したので、2番目に一致した文字列が置換されます。引数「出現」にマイナスの数を指定すると、最後に見つかった方からカウントします。上図では、右からカウントしているような感じです。

REGEXREPLACE 関数には、もうひとつ便利な仕組みが用意されています。それは、グループ化されたパターンを、置換文字列内で「$1,$2,$3…」として扱えるという仕組みです。たとえば、こんな感じです。

雑感

今回、新しく「正規表現系のワークシート関数」が追加されたわけですが。確かに、技術として見れば、なかなかおもしろいです。私も、秀丸エディタでは正規表現を普通に使っていますし、その利便性も理解しています。では、Excelユーザーにとって"嬉しい"のかと言えば、そんなことはないと思います。実務で、これら正規表現系の関数を使う人は、ほとんどいないと感じます。理由は2つあります。

1つめの理由は、とにかく正規表現は難しいということです。パターンの書き方は複雑ですし、自分がやりたいことを適切に記述するのって、ワイルドカード(*と?)に比べても、相当に難しいです。まぁ、それだけ複雑なことが実現可能なのですから、しかたありませんよね。そんな、東大王の"超~難問"レベルのパターンを、間違えずに記述する自信がありますか?もしかすると「ChatGPTに作ってもらえばいい」なんて考えていませんか?それが正しいという保証がありますか?Excelユーザーは"実務"を遂行するのが目的です。もし、間違った処理によって業務が滞ったり、何らかの損失が生じた場合、OpenAI社が補填してくれるんですか(笑)?「とりあえず動けばいい!」なんて安直な考えだと、誰も引き継げない"属人化マクロ"の二の舞になりますよ。気をつけてくださいね。

正規表現系の関数があまり使われないだろうという理由の2つめは、そもそも多くのExcelユーザーは、そんな複雑な処理をしていないからです。過去、6万人近いExcelユーザーと会ってきましたが、ほとんどの方が行っている作業は、もっと単純でシンプルです。提供されるデータを所定のセルに代入するだけだったり、関数にしても、使うのはSUMIFやVLOOKUPなど基本的なものばかりです。正規表現を使って複雑な置換が要求される業務なんて、ごくごく一部です。そもそもExcelではワイルドカードを使えます。正規表現なんて使わなくても、ワイルドカードの曖昧検索で十分というユーザーの方が、圧倒的に多数です。

もちろん、正規表現を否定するつもりはありません。超役立つ局面だって、きっと、ときどきあるでしょう。自分がコントロールできる、シンプルなパターンであっても、正規表現でなければできないこともあるでしょう。そんなときのために、持ちネタのひとつとして、できれば使えるようになってください。