いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

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

 Googleスプレッドシートで、ある文字列が別の文字列を含むかどうかを判定する方法についてです。
 COUNTIF関数とワイルドカードを用いる方法が有名ですが意外に複雑なので、ここでは別の方法を紹介します。

  • REGEXMATCH関数を使って、ある文字列が別に指定した文字列を含むかどうかを判定できます。

手順

f:id:accs2014:20201206121058p:plain:right:w500

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

 C3セル

=REGEXMATCH(B3,"山")

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

f:id:accs2014:20201206121108p:plain:right:w500

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

 C3セル

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

 

f:id:accs2014:20201206121112p:plain:right:w500

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

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

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

f:id:accs2014:20201206121116p:plain:right:w550

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

 C3セル

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

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

f:id:accs2014:20201206121121p:plain:right:w600

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

 C3セル

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

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

f:id:accs2014:20201206121125p:plain:right:w500

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

 C3セル

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

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

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

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

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