いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)指定した文字列を含むか判定する

 Googleスプレッドシートで、あるテキストが指定した文字列を含むかどうかを判定する方法についてです。
 COUNTIF関数とワイルドカードを用いる方法やFIND関数を用いる方法も考えられますが、ここでは応用範囲の広いREGEXMATCH関数を使った方法を紹介します。

  • REGEXMATCH関数を使って、ある文字列が別に指定した文字列を含むかどうかを判定できます。
  • FILTER関数との相性が良いのがポイントです。

手順

 B列には県の名前が並んでいます。
 さらにC3セルに次のような式を入力して、B3セルの文字列が「山」の字を含むかどうか判定しています。

 C3セル

=REGEXMATCH(B3,"山")

 REGEXMATCH関数を使って判定しています。
 COUNTIF関数だと「=COUNTIF(B3,"*山*")」となるところですが、REGEXMATCH関数だと第2引数で指定した文字列を含むかどうかを直ちに判定でき、ワイルドカードを考慮しなくてもよいのがポイントです(後でみるように、正規表現を用いてワイルドカードより複雑な抽出をすることもできます)。
 また、COUNTIF関数の場合は戻り値が数値になりますが、REGEXMATCH関数ではTRUEまたはFALSEとなります。
 

 戻り値がTRUEまたはFALSEですので、そのままIF関数と組み合わせることができます。
 画像ではC3セルに次のように入力し、さらに下方にコピーしています。

 C3セル

=IF(REGEXMATCH(B3,"山"),"山を含む","山を含まない")

 

 もちろん2文字以上の文字列も判定できます。
 画像では「島県」という文字列を含むかどうか判定しています。
 C3セルの式は次のようになっています。

=IF(REGEXMATCH(B3,"島県"),"島県を含む","島県を含まない")

 島根県は島の字と県の字を両方含んでいますがつながっていないので、「島県」を含まないものと判断されています。
 

 ここからはちょっとした応用です。
 REGEXMATCH関数では正規表現を用いた判定ができます。簡単に言ってワイルドカードの拡大版のようなものですが、さらに複雑な抽出ができます。
 画像では「山」か「島」のどちらかを含むかどうかを判定しています。

 C3セル

=IF(REGEXMATCH(B3,"[山島]"),"山か島を含む","山も島も含まない")

 
 複数の文字列を並べて角カッコで囲むことで、いずれかの文字を含むかどうか判定できます。
 

 2文字以上の文字列について、いずれかを含むかどうか判定するには次のようにします。

 C3セル

=IF(REGEXMATCH(B3,"山県|島県"),"山県か島県を含む","山県も島県も含まない")

 複数の文字列を並べて「|」(縦線、パイプライン)で区切ることで、いずれかの文字列を含むかどうか判定できます。
 

 指定した文字で始まる(終わる)かどうか、という判定も可能です。

 C3セル

=IF(REGEXMATCH(B3,"^島"),"島で始まる","島で始まらない")

 正規表現で「^」は文字列の先頭を表しますので、「^島」は「文字列の先頭にある『島』」ということになります。

 なお、文字列の最後は「$」と表されますので、例えば「県」の字で終わるかどうか判定する場合は次のようになります。

=IF(REGEXMATCH(B3,"県$"),"県で終わる","県で終わらない")

 
 以上ではIF関数との組み合わせの例を紹介しましたが、REGEXMATCH関数の効果を実感できる最も良い例はFILTER関数との組み合わせです。「~を含む行を抽出する」という操作(FILTER関数とCOUNTIF関数の組み合わせではうまくいかない)を簡単に実現できます。
 具体的な例は次の記事(「FILTER関数とREGEXMATCH関数による抽出」の項)で紹介しています。

www.officeisyours.com

 最後に補足です。
 正規表現はワイルドカードより難しいものの、高度な判定が可能です。REGEXEXTRACT関数(文字列抽出)やREGEXREPLACE関数(文字列置換)などにも応用できますので、Googleスプレッドシートを学習するうえで重要なスキルとなっています。
 なお、Googleスプレッドシートで扱える正規表現の詳細について、次の記事で紹介しています。

www.officeisyours.com