質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

2回答

2887閲覧

REGEXEXTRACT 正規表現について

ShinoBoo

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

1クリップ

投稿2021/12/06 03:19

前提・実現したいこと

スプレッドシートにて
同一セル内の文字列から、「」内の文字を抜き出して表示させたい。

「あいう駅」徒歩●分、「かきく駅」徒歩●分、「さしす駅」徒歩●分
もしくは
「あいう駅」、「かきく駅」、「さしす駅」

該当のソースコード

A2 = "〇〇線「あいう駅」徒歩●分、〇〇線「かきく駅」徒歩●分、〇〇線「さしす駅」徒歩●分"

B2 = REGEXEXTRACT(A2, "\「.+?\」" )

上記の場合、「あいう駅」は表示されるが
2つ目以降の駅が表示されないです。
正規表現が正しくないと思うのですが…

仮に、正規表現を正しく打てば実現可能でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

KojiDoiさんも書かれてますが、REGEXEXTRACTの公式の説明に「正規表現と最初に一致する部分文字列を抽出します」と記載がある通り、最初の1件のみを抽出するのは仕様なのです。

https://support.google.com/docs/answer/3098244?hl=ja

ただ、説明ページ内に同じく記載の通り「キャプチャ グループ」が使えるので、

仮に、正規表現を正しく打てば実現可能でしょうか?

という質問に対しては、複数対象であっても「一応可能です」という回答になります。
たとえば、

GoogleSheets

1A2 = "〇〇線「あいう駅」徒歩●分、〇〇線「かきく駅」徒歩●分、〇〇線「さしす駅」徒歩●分" 2 3B2 =REGEXEXTRACT(A2, "^.*?(「.+?」).*?(「.+?」).*?(「.+?」).*?" )

とすれば、希望する動作にはなります。でも、駅の数は変動だと思うので微妙ですよね。
ちなみに上記は 「○○駅」が3つより少ない場合はエラーになりますし、4つ以上の場合は4つ目以降は抽出されません。

というわけで、もう少しマシな方法を回答しておきます。
本当は gフラグが使えればいいのですが、残念ながらシート関数で扱える正規表現では対応していないので、少し工夫する必要があります。

REGEXEXTRACTと同様に正規表現を扱える関数に REGEXREPLACEがあるのですが、こちらを活用する方法がおススメです。

https://support.google.com/docs/answer/3098245?hl=ja&ref_topic=3105625

公式に記載の通り、こちらは「正規表現に一致するテキスト内のすべてのインスタンスが置き換えられます」ということで一致したもの全てを対象にできますし、公式に記載されてないですが、こちらもキャプチャグループを使うことができます。

というわけで、REGEXREPLACE を使って

..任意の文字列「○○駅」..任意の文字列 という塊を

「○○駅」 と、該当の文字列だけ残すように置き換えるという処理をすれば良いのです。

ただ、これだけだと抽出後が 一つのセルに"「あいう駅」「かきく駅」「さしす駅」" と、繋がって抽出されてしまうので、もう一工夫必要です。

最終的に式としては以下のような感じ。

GoogleSheets

1A2 = "〇〇線「あいう駅」徒歩●分、〇〇線「かきく駅」徒歩●分、〇〇線「さしす駅」徒歩●分" 2 3B2 =SPLIT(REGEXREPLACE(A2,".*?(「.+?」).*?|.*?$","$1,"),",")

投稿2021/12/06 09:10

編集2021/12/06 09:12
sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinoBoo

2021/12/06 09:54

ご回答ありがとうございました。 関数までご記載いただき大変助かりました。 splitで割ったものを別関数で結合して使用したいと思います。 大変勉強になりました。
guest

0

REGEXEXTRACTはマッチした最初の文字列しか返しません。正規表現によるマッチングとはそういうものです。正規表現に間違いがあるというより、目的をREGEXTRACTを使って解決しようという方針が間違っているといえます。

対案1
SPLIT関数を使う。結果は式を置いたセルの右側のセルに展開される。ここに何か既存のデータがあるとエラーになってしまうので、空けておかないといけない。

対案2
REGEXPREPLACEを使って、「」に囲まれていない部分を削除してしまう。

イメージ説明

投稿2021/12/06 08:20

編集2021/12/06 08:25
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinoBoo

2021/12/06 09:53

ご回答ありがとうございました。 REGEXEXTRACTがそもそも不適切な選択だったのですね。 ご教授誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問