いきなり答える備忘録

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

(Gスプレッドシート)文字列中の特定の文字(文字列)までを抽出する

 Googleスプレッドシートで、文字列中の特定の文字(指定した文字)までを取り出す方法についてです。
 特定の文字の直前までを取り出すケースや、2文字以上の文字列を指定するケースについても示します。

  • REGEXEXTRACT関数により、文字列中のうち特定の文字(文字列)までの部分を取り出すことができます。

手順

特定の文字までを抽出する例

f:id:accs2014:20200429133855p:plain:right:w450

 B3:B8に入力されている文字列から、それぞれ「@」までの部分を抽出するものとし(@を含む)、「@」が複数回現れる場合は最初の「@」までを抽出するものとします。

 画像は、C3セルに次のように記して式を下方にフィルコピーした様子です。

=REGEXEXTRACT(B3,".*?@")

 必要な関数はREGEXEXTRACTの1つだけです。第2引数のうち「.*?」は0文字以上の文字列を表しており、「@」はそのまま「@」を表します。
 これにより文字列中の「@」までの部分を抽出できます。
 「.*?」の部分の「?」がないと、「@」が複数回現れたときに異なる結果となります。具体的に表しますと"より長く"文字列を抽出しようとするため、「まみむ@め@も」に対して「まみむ@め@」まで抽出してしまいます。
 

f:id:accs2014:20200429133859p:plain:right:w450

 結果はこうなります。

 なお、ARRAYFORMULA関数を使えばC3に次のように記すだけでこれと同じ結果が得られます(以下同様)。

=ARRAYFORMULA(REGEXEXTRACT(B3:B8,".*?@"))

特定の文字の直前までを抽出する例

f:id:accs2014:20200429133903p:plain:right:w450

 B3:B8に入力されている文字列から、それぞれ「@」の直前までを抽出するものとします(@を含めない)。

 画像は、C3セルに次のように記して式を下方にフィルコピーした様子です。

=REGEXEXTRACT(B3,"(.*?)@")

 1つ上の例との違いは「.*?」の部分がカッコで囲まれていることです。これによりカッコに該当する部分だけを文字列として抽出することができます。
 カッコに含まれていない「@」はマッチング(検索)には用いられるものの、抽出される文字列には含まれなくなります。

f:id:accs2014:20200429133906p:plain:right:w450

 結果はこうなります。

複数の文字種を指定して抽出する例

f:id:accs2014:20200429133911p:plain:right:w450

 「特定の文字」を複数種指定し、それらの中で最初に現れるものまでを抽出する例です。
 
 B3:B8に入力されている文字列から、「@」または「_」の直前までを抽出するものとします。
 画像は、C3セルに次のように記して式を下方にフィルコピーした様子です。

=REGEXEXTRACT(B3,"(.*?)[@_]")

 複数の文字種を「[ ]」で囲むことで「いずれかの1文字にマッチする」という指定をすることができます。これにより「@」か「_」が出現するまでの文字列を抽出することができます。
 

f:id:accs2014:20200429133917p:plain:right:w450

 結果はこうなります。

 「@」や「_」を抽出結果に含める場合は「(.*?)」を「.*?」に変えればOKでです。

2文字以上の文字列を(複数)指定して抽出する例

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

 2文字以上の文字列を複数種指定し、それらの中で最初に現れるものまでを抽出する例です。
 
 B3:B8に入力されている文字列から、「@_」または「_@」の直前までを抽出するものとします。
 画像は、C3セルに次のように記して式を下方にフィルコピーした様子です。

=INDEX(REGEXEXTRACT(B3,"(.*?)(@_|_@)"),1)

 文字列を「|」で区切り、全体をカッコで囲むことで、「いずれかの文字列にマッチする」という指定をすることができます。
 ただしカッコで囲むことにより「@_」や「_@」も抽出結果に含まれてしまう(しかも別のセルに分割される)ため、INDEX関数を使って取り除いています。苦肉の策です。

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

 結果はこうなります。
 単独の「@」や「_」が含まれていても「@_」や「_@」が含まれていない場合は何も抽出されずエラーとなります。

 なお「@_」や「@_」を抽出結果に含める場合はINDEX関数をCONCATENATE関数に置き換えればOKでです(つまり「=CONCATENATE(REGEXEXTRACT(B3,"(.*?)(@_|_@)"))」のようになります)。