(Excel)XLOOKUP関数で正規表現を使った検索をする方法

 ExcelのXLOOKUPで、検索値を正規表現パターンとみなして検索をする方法についてです。
 第5引数(一致モード)を「3」にすることで可能になりますが、バージョンによって指定できない場合もあるのでご注意ください。

基本的な使用例

 次の画像では、B列から「カレー」の文字を検索して、対応する値段を取得しています。

 E3セル

=XLOOKUP("カレー",B3:B7,C3:C7,,3)

 第5引数を「3」(正規表現に一致)としています。
 通常のXLOOKUP関数の場合だと完全一致検索になるので何も取得できずエラーになるのですが、このように正規表現を使用することを指定すると、特殊な文字を使わなくても部分一致検索(~を含む)となります。



 ワイルドカードのように記号を使わなくても部分一致になるのは便利ですが、このことを忘れると意図しない結果になる場合があります。
 次の画像では第5引数を「3」としつつ「もも」の値段を取得しようとしています。この場合B3セルの「すもも」が「もも」を含んでいるので、結果的に「すもも」の値段を取得してしまいます。

 E3セル

=XLOOKUP("もも",B3:B7,C3:C7,,3)

 この場合は単に第5引数の指定をしなければ完全一致になりますが、正規表現の特殊な文字を組み合わせたうえで完全一致検索にする場合は「^」「$」の記号を使って対応する必要があります。完全一致検索の実例は次の節を参照ください。



 また、正規表現の特徴として空白はどんな値にも部分一致します。
 次の画像ではF3セルに「=XLOOKUP(E3,B3:B7,C3:C7,,3)」と入力しています。E3セルの文字をB列から検索して値段を取得しようという式ですが、E3セルが空白セルなのに「すもも」の値段「180」を取得しています。E3セルが空文字列(="")の場合も同様です。

 これを避ける場合は「=IF(E3="","",XLOOKUP(~))」のようにする方法が考えられます。



 次の画像は特殊な文字(メタキャラクタ)を使う例です。
 B列の値(ID)が半角英小文字(a~z)を含むものの商品名を取得しています。

 E3セル

=XLOOKUP("[a-z]",B3:B6,C3:C6,,3)

 「[a-z]」はaからzまでの文字、つまり半角英小文字を意味します。ワイルドカードとは異なり一定の文字の種類を指定して条件を設定できるのが正規表現の特徴です。
 なおワイルドカードの「?」「*」は正規表現でそれぞれ「.」「.*」と表すことができます。
 本記事では詳細は省略しますが、文字の種類や長さを指定するメタキャラクタについての詳しい例は参考記事(下記参照)をご確認ください。

完全一致・前方一致・後方一致による検索例

 正規表現を使ったうえで完全一致検索をしたり、前方一致(~で始まる)、後方一致(~で終わる)の検索をする例についてです。


 次の画像では、B列から「もも」を完全一致で検索して対応する値段を取得しています。

 E3セル

=XLOOKUP("^もも$",B3:B7,C3:C7,,3)

 正規表現で「^」は文字列の先頭を、「$」は文字列の末尾を表します。
 よって「^もも$」は「先頭と末尾の間に『もも』だけがある文字列」という意味になり、意図する文字列(もも)についての完全一致検索となります。


 同様に「^もも」とすれば前方一致(~で始まる)検索に、「もも$」とすれば後方一致(~で終わる)検索になります。
 ワイルドカードの場合と比べて記号のつく位置が左右逆になるので注意してください。

大文字・小文字と全角・半角の区別

 次の画像は通常の(第5引数を指定しない)XLOOKUP関数の使用例です。
 ここではE3セルに「=XLOOKUP("XB039",B3:B6,C3:C6)」と入力しています。つまりB列から「XB039」を検索して対応する商品名を取得しようとしていますが、XLOOKUP関数は通常大文字と小文字しない(これはほとんどの関数と同じ)だけでなく全角と半角も区別しません。結果は「xb039」に対応する「りんご」となっています。

 


 そこで次の画像では第5引数を「3」とし、正規表現を指定することで大文字と小文字を、さらに全角と半角をも区別した検索としています。

 E3セル

=XLOOKUP("^XB039$",B3:B6,C3:C6,,3)

 「^」と「$」は完全一致検索を意図したものです(上記例を参照)。
 このように正規表現を利用するだけで大・小文字と全角半角の区別ができます。これ以外にはEXACT関数を併用する方法も考えられますが、こちらの方が簡単に済みます。
 なお、繰り返しになりますが「^」と「$」がないと部分一致検索になるのでご注意ください。



 ところで、その他の関数のように「全角と半角は区別するが大文字と小文字を区別しない」とする場合は次のようにするのが一例です。

 E3セル

=XLOOKUP("(?i)^XB039$",B3:B6,C3:C6,,3)

 「(?i)」が大文字と小文字を区別しないようにする記号です。
 ただし画像の例では意図しない値を取得する結果となっています。

複数条件(ANDとOR)の指定

 AND条件(かつ)やOR条件(または)を指定する例です。
 REGEXTEST関数を併用する方がわかりやすいかもしれませんが、ここでは正規表現のみで実現してみます。


 まずAND条件の例です。
 B列から「みかん」と「もも」の両方を含む商品名を検索して値段を取得しています。

 E3セル

=XLOOKUP("^(?=.*みかん)(?=.*もも)",B3:B7,C3:C7,,3)

 難しいです。「^」は文字列の先頭を表し、「(?=.*みかん)」は「(先頭の)右隣に0文字以上の文字と『みかん』が続く」、「(?=.*もも)」は「(先頭の)右隣に0文字以上の文字と『もも』が続く」という意味です。全体として「『みかん』を含み、かつ『もも』を含む」という意味になります。B6セル内での「みかん」と「もも」の出現順は逆ですが検索できている点をご確認ください。
 「(?=~)」は肯定先読みと呼ばれる機能ですが、これについても詳しくは参考記事を参照ください。



 続いてOR条件の例です。
 B列から「みかん」と「もも」のいずれかの含む商品名を検索して値段を取得しています。B列にはどちらの値も存在しますが、XLOOKUP関数の機能により、取得されるのは最初に見つかる(最も上にある)「みかん」となっています。これはもちろんAND条件など他の例でも同様です。

 E3セル

=XLOOKUP("^(みかん|もも)$",B3:B7,C3:C7,,3)

 ここでも完全一致検索を意図して「^」「$」を併用しています。
 このように「|」でつなぐことで「複数の文字列のいずれか」を指定できます。さらに「|」を増やせば3つ以上の条件にできます。部分一致にする場合はカッコも不要で「みかん|もも」となります。
 なお、検索する文字が1文字だけの場合は「^[ABC]$」のように指定できます(A,B,Cのいずれか)。「^[A-Z]$」とすれば半角英大文字(1文字)となります。

備考

FILTER関数との使い分けについて

 いくつかの実例を紹介しましたが、実際のところXLOOKUP関数では1つのデータしか取得できないので「~を含む」とかあいまい検索をする例はさほど多くないものと思われます。
 複数データを抽出する場合はFILTER+REGEXTEST関数が適していますのでそちらをご利用ください。

 参考記事
(Excel)FILTER関数で「~を含む・含まない」を条件にする方法 - いきなり答える備忘録

使用できる正規表現の詳細について

 使用できる正規表現については次の記事で紹介しています。
 REGEX~関数での利用を想定した記事ですがXLOOKUP関数でも同様です。

(Excel)REGEX~関数で使える正規表現 - いきなり答える備忘録