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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

2回答

658閲覧

スプレッドシートの正規表現で検索欄に「a*」とし、置換後の文字列を「1」とした時の挙動について

bah91929

総合スコア19

Google スプレッドシート

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/04/25 05:12

ご回答者様

いつもお世話になっております。

スプレッドシートの正規表現で検索欄に「a*」とし、置換後の文字列を「1」とした時の挙動について質問をさせていただきたく存じます。

以下の図のように置換前の文字を、
a
aa
aaa
ba
baba
babaa
とし、検索と置換を立ち上げて検索を「a*」、置換後の文字列を「1」としました。
イメージ説明
正規表現における「*」は、直前の文字を0 回以上繰り返す文字列の検索なので、
上記すべての文字列が検索の対象となるのは分かります。

しかし、置換後の文字列を「1」として置換したところ、
置換後
11
11
11
1b11
1b11b11
1b11b11
となっており、僕が想定していた置換後の文字列と異なっております。

僕が想定していたのは、
想定置換後、
1 ←「a」を1回繰り返した状態。 検索「a」を「1」に置換
1 ←「a」を2回繰り返した状態。 検索「aa」を「1」に置換
1 ←「a」を3回繰り返した状態。 検索「aaa」を「1」に置換
b1 ←「a」を1回繰り返した状態。 検索「a」だけを「1」に置換
b1b1 ←「a」を1回ずつ繰り返した状態。 検索「a」だけを「1」に置換
b1b1 ←最初の「a」を1回、次の「a」を2回繰り返した状態。 検索「a」を「1」に置換、その次の「aa」を「1」に置換
です。

なぜ正しい方の置換後の文字列で、前半3つ(a aa aaa)が「11」と1が2つ付き、後半ではbの前後に「1」が付いているのか分かりません。

*や正規表現について、僕が誤解している部分があるかと存じますので、ご教授くださいますと幸いです。

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

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

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

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

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

guest

回答2

0

"a""11"になる理由:

まず、"a""1"に置換されます。置換処理が継続するので、元の"a"の次を見ると""ですが、これはa*にマッチするのでこの空文字列も"1"に置換されます。

他も同様。

意図通りにするには、正規表現はa+ですね。

投稿2020/04/25 05:47

otn

総合スコア85901

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

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

bah91929

2020/04/25 06:40

otn様 早速のご回答に感謝いたします。 まず、"a"が"1"に変換され、その後、””の処理で1が足されるのですね。 式にすると、a →"a"+"" → 11 でしょうか? sawa様のご回答では、 a → ""+"a" → 11 と空欄の位置が前後逆なのですが、もしどちらの考えも合わせますと、 a → ""+"a" + ""→ 111 となりそうで、どの順序で考えればいいか分からなくなってきました・ お手数ではございますが、可能でございましたら、教えていただけますと幸いです。
otn

2020/04/25 09:38

*は最大回数マッチつまり、0回繰り返し、1回繰り返しの両方がマッチする場合、1回繰り返しが採用されます。つまり"a"です。 次の空文字列は0回繰り返ししかマッチしないので、0回繰り返しが採用されます。
guest

0

すでに otn様が回答されており、書かれている通りなので補足的な回答ですが、

正規表現における「*」は、直前の文字を0 回以上繰り返す

ってのが曲者で、「a*」だと aを0回繰り返すケース = aがない無い文字列 = ""(空欄) も拾っちゃいます。

ba*g だったら、bag、baaag だけでなく bgもヒットするわけです。

なので、

a → ""+"a" → 11
ba → ""+"b"+"a" → 1b1

だし、例えば検証されてないケースだと

ab → ""+"a"+"b"+"" → 11b1
c → ""+"c"+"" → 1c1

と意図しない動きとなるのです。

期待される置換をするには、直前のパターンの1回以上の繰り返しを表す 「+」を使えばよいです。

投稿2020/04/25 06:10

編集2020/04/25 06:14
sawa

総合スコア3002

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

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

bah91929

2020/04/25 07:06 編集

sawa様、早速の丁寧なご教授ありがとうございます。 お書き下さった具体例によって、理解が深まってまいりました。 2点疑問が出てきましたので、追加で質問させていただければと存じます。 ◆ aがない無い文字列 = ""(空欄) について 1.""(空欄) も拾うということで、空白行まで検索範囲を広め、検索:「a*」、置換後の文字列「1」としましたが、空白行に「1」が入りません。 *の暗黙のルール?として、何も値が入っていない空白行には*が適用されないのでしょうか? 2.""(空欄) の定義について →正規表現における""(空欄) とはどういったものを指しますでしょうか? 例えばセルの左詰め(スペースなど無し)で「a」と入力した場合、通常だと空欄はないかと思いました。 しかし正規表現で検索「a*」、置換文字列「1」とすると、ご指摘のように「a → ""+"a" → 11」とaの左側に空欄があると仮定され、その空欄はなぜか1つというルールがあるのでしょうか?(空欄が2つだと、111になると思います)
sawa

2020/04/25 06:58

追加ご質問の件ですが、私もなんとなーく理解している(気になってる)だけなので、正しい回答になっていないかもしれませんこと、ご了承ください。 以下、私なりの理解です。 1. これは スプレッドシートの検索・置換の仕様だと思います。 処理スピードを速めるため、空欄を飛ばしてるんじゃないでしょうか? たとえば、A1セルが空欄の状態で B1あたりに  =REGEXREPLACE(A1,"a*","1") としてあげると、1を返します 2. 該当の 検索:「a*」だと、""(空欄)と"a・・(aの繰り返し)を探しにいくのだと思います。 出だしを空欄と処理するけど、aの後ろを空欄と判断しないのは、 aで終わってるマッチした文字列が最後なら = 文字列の最後 という判断をして、 処理を終了するからじゃないでしょうか。そうしないとエンドレスになっちゃうから? ab → 11b1 だけど、 ba → 1b1 となる = 最後の文字が検索ワードにヒットしないと空白を見つけて置換する という動きなので、私は上記のように解釈しています。
bah91929

2020/04/25 07:20

ご回答ありがとうございます。 仕様の可能性が高いですね。 また、スプレッドシートでbaを検索「a*」、置換文字列「1」で置換すると、「1b11」となりました。 sawa様では1b1となりましたでしょうか?
sawa

2020/04/25 07:38

失礼しました。ba → 1b11 ですね。ちゃんと後ろの空白も拾ってました。 a や aa の時、なぜ111じゃなくて 11 なのかは わかりませんw すいません。 Closeせず、詳しい人の回答をお待ちください。(私も気になりますので)
bah91929

2020/04/25 08:17

ご返信ありがとうございます。 もしかすると、「a*」のように「1文字*」の場合は以下の形になるのかもしれません。 条件例 検索:a* 置換後の文字列:1 ・最初は必ず「""(空欄)=置換」される ⇛a → ""+"a" → 11 ・次に、該当文字が検索条件の*の前の文字ではない場合、その直後は「""(空欄)=置換」される ⇛ab→ ""+"a"+"b"+ "" → 11b1 ⇛ba→ ""+"b"+ ""+"a"→ 1b11 この考えだと辻褄が合う気がしてまして、対話をさせていただく中で僕の中で1つの仮説が生まれました(笑) どちらにせよ(ややこしくなるので)正規表現で「1文字*」は使用非推奨なのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問