正規表現で置換する「REGEXREPLACE関数」の使い方と便利な応用技(Googleスプレッドシート)
こんにちは、エドです。
エクセルと似たような使い方ができますが、スプレッドシートにしかない便利な関数がいくつかあります。
「REGEXREPLACE」関数の概要
その一つが今回紹介する「REGEXREPLACE」関数。
読みづらいですけど、RegularExpressionsReplaceなので「レッグエグリプレイス」ですかね。脳内ではそう呼んでいます(笑
さて、今回ご紹介するREGEXREPLACEですが、エクセルでも有志が作成したアドオンを入れたり、VBAを使うことで同様のことができます。デフォルトでは使えないのでスプレッドシートにしかない関数として紹介しています。
この関数はセルの内容を正規表現で置換する関数です。
使い道が思いつかない方が大半だと思いますが、スプレッドシートで日々の目標管理やモニタリングをしている方には非常に便利です。
後半に応用編を載せていますが、私も実際の業務で使っているほど便利です。
論理思考が必要になるのでプログラマー脳の方のほうが相性いいかもしれませんね。
※正規表現はかなり融通が利き、カッコに囲まれた部分だけ置換、URLからドメインだけ取得など色々な操作が可能です。ただし書き方はある程度勉強が必要です。
ここでは正規表現の書き方は深く言及していません。細かい解説は以下のサイト様が詳しく記載してありますので参考になります。
基本的な使い方
まずは基本的な使い方から。とにかく色々なことができるので、よく使いそうな例をいくつか解説します。
正規表現を使わずに普通に置換する
=REGEXREPLACE( [ 置換したいセル ] , [ 正規表現 ] , [ 置換文字列 ] )
まずは簡単な使い方から。
=REGEXREPLACE(A1,"カレー","ラーメン")
普通のSUBSTITUTE関数を使用したときと同じ使い方です。
A1セルの内容から「カレー」を探し出し、「ラーメン」に置換しています。
これだとこの関数を使う意味がないので、正規表現を使ってみましょう。
特定の文字列の前を消す
=REGEXREPLACE( [ A1 ] , [ ".+カレー" ] , [ ”” ] )
「.+」は"任意の文字1文字以上の繰り返し"という意味になります。難しいですが単純にカレーの文字が出てくる前に何か文字があって、それが何文字あっても対象、という考え方です。
カレーは消したくないのなら
=REGEXREPLACE( [ A1 ] , [ ".+カレー" ] , [ ”カレー” ] ) や
=REGEXREPLACE( A1 , ".+(カレー)" , "$1" )
となります
カッコに囲まれた文字だけ置換
=REGEXREPLACE( A1 , "「.+」" , "ラーメン" )
カッコが()にの場合は注意が必要です。正規表現でも()を使うので、コンピュータ側が正規表現なのか文字そのものが対象なのかわからなくなるのです。
こういう場合は¥(半角では\)をその文字の前につけてあげます。 これをエスケープシーケンスといいます。単純にエスケープということもあります。
※ほかにも "?" や " . " や " * " などもエスケープが必要です
↓は\をつけなかった例
文字の順番を入れ替える
=REGEXREPLACE( A1 , "(.+)(カレー.+)" , "$2$1" )
カレーが出てくる前の1文字以上連続する文字と、カレー以降の文字全部の2つに分け、順番を入れ替えています。
$1、$2はその前の正規表現の()に関連していて、$1が一つ目のかっこ、$2が2つめのかっこになります。
$2、$1としているのが入替の部分ですね。
(.+)が赤字の部分、(カレー.+)が青字の部分です。赤字が$1、青字が$2です。
便利な使い方
ダブルコーテーションに囲まれたカンマを削除したい
例えば以下はGoogle広告のエクスポートデータですが、これをスプレッドシートで管理するとします。このままカンマ区切りで分割してしまうと・・・
あれ?何かおかしい!
そう、数値のカンマも区切られてしまうんですね。
("テキストを列に分割"の機能を使用すると、すべて文字列として扱われるのでこのように壊れたりはしませんが、書式が文字型になってしまいます。書式を維持するにはSPLIT関数が良いのですが、この問題に引っ掛かります)
前フリが長くなりましたが、その場合の置換方法
=REGEXREPLACE(A2,"""(.+?),(.+?)""","$1$2")
ワークシート関数のREGEXREPLACEは正規表現をダブルコーテーションで囲まなければならないので、ダブルコーテーションそのものを正規表現で書くにはちょっとコツがいります。
ダブルコーテーションを2つ書くとダブルコーテーションの中にダブルコーテーションを書くことができます(??)
=REGEXREPLACE(A2,"""(.+?),(.+?)""","$1$2")
緑が正規表現で指定したダブルコーテーション。
1.ダブルコーテーションで始まり
2.その中で1文字以上連続でカンマが出てくるまで
※?は最小一致といいますが詳しくは割愛。正規表現にヒットする一番小さい単位を持ってくるという意味です。
3.カンマの後のダブルコーテーションが出てくるまで
4.そのヒットしたカンマ前とカンマ後をカンマ抜きで置換
という流れになります。
以上、REGEXREPLACE関数でした!
機会があれば他の機能についても解説してみたいと思います!
その他関数