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

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

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

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

Q&A

解決済

2回答

1203閲覧

なぜ、マッチしないのか

aaaaaaaa

総合スコア501

正規表現

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

0グッド

2クリップ

投稿2017/07/26 10:40

SRC=array.c builtin.c eval.c field.c gawkmisc.c io.c main.c
missing.c msg.c node.c re.c version.c

という文章を「^\w+=.?(\\n.?)*」という正規表現で処理をすると詳説正規表現第三版(173頁)によれば、合致する文字は、「SRC=」だけだそうです。

てっきり、「SRC=」まで合致し終えた後も「a」が.?に合致するかどうか調べるが、控えめなので(\\n.?)で試す。合致しないので「a」が.?合致するかどうか試す。合致するので次は、「r」を試す。というのを行継続記号の「**」が来るまで調べる。
行継続文字の「
*」は、(\\n.?)*にマッチし…と思っていたのですが、詳説正規表現の173頁には、

しかし、これも機能しない。控えめな量指定子がオプションのものにマッチするには、それを強制される場合だけだが、この場合は、「=」の後ろのすべてのものがオプションなので、何かにマッチすることを控えめな量指定子に強いるものはないのだ。

控えめな量指定子のサンプルは、'SRC='にマッチするだけであり、それでは答えにならない。

とありました。つまり見当違いだったのですが、なぜ「SRC=」にしかマッチしないのかが良くわかりません。等号より後ろの部分がオプションというのは、正規表現の等号のあとにある三つの*のことを言っているのでしょうか。*は、合っても無くてもマッチするので、「SRC=」にしか合致しないのか、と思ったのです。

なぜ、「SRC=」しか合致しなかったのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

正規表現でオプションって言ったら「大文字と小文字を区別しない」は「i」とかそういう設定のことを指すものだと私は思うのですが、この文章では別の意味でオプションっていう単語を使っているみたいですね。何かの直訳なのでしょうか?

あと本を持ってないので多分ですが\\nの意図を汲むと文字列は
array.c builtin.c eval.c field.c gawkmisc.c io.c main.c
missing.c msg.c node.c re.c version.c
って具合に改行コードを含むと思います。

(説明文の解読)
しかし、これ(※1)も機能しない。控えめな量指定子(※2)がオプションのもの(※3)にマッチするには、それを強制される場合(※4)だけだが、この場合は、「=」の後ろのすべてのもの(※5)がオプション(※6)なので、何かにマッチすることを控えめな量指定子に強いるものはないのだ。(※7)
控えめな量指定子のサンプル(※8)は、'SRC='にマッチするだけであり(※9)、それでは答えにならない。

(※1)^\w+=.?(\\n.?)のこと
(※2)*の後ろの?のこと
(※3)ここでのオプションは「必須ではない文字列(≒追加するか判断するようなもの?)」って意味なのかと思います。具体的な文字列ではなく、控えめな量指定子の説明のための抽象的な表現。
(※4)/^\w+=.
?hoge/と"SRC=arrayhoge"のときとか.?の箇所が埋まっていないとマッチしない場合とか
(※5)もちろん array.c builtin.c eval.c field.c gawkmisc.c io.c main.c
missing.c msg.c node.c re.c version.cのこと
(※6)やっぱり、必須ではない文字列(≒追加するか判断するようなもの?)って意味ですかね
(※7)※4の説明を参考にしてほしい。.
?のところは※4で書いたので略。その後ろの(\\n.?)も、たとえ1個以上でマッチ可能な文字列だったとしてもが0個以上って意味なので、控えめな量指定子(?のこと)の箇所を埋めるように強制するような指定内容ってわけではない。だって0個でもいいので。
(※8)^\w+=.
?(\\n.?)とarray.c builtin.c eval.c field.c gawkmisc.c io.c main.c
missing.c msg.c node.c re.c version.c
(※9)※4と※7の説明を参考。比較として^\w+=.
?(\\n.
?)だとすれば\の箇所で強制するためSRC=arrayhoge.c builtin.c eval.c field.c gawkmisc.c io.c main.c \までがマッチしますね。

分かりにくいですが、上記をまとめると「.?」でマッチするにはそれ以降で「マッチしないといけないという箇所」が必要ってことです。それが例題^\w+=.?(\\n.*?)にはないため「.?」ではマッチせず「SRC=」までしかマッチしないってことです。

投稿2017/07/26 12:25

oskbt

総合スコア1895

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

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

0

バックトラック

(\\\n.*?)* は最長一致ですが、.*? は最短一致であり、(\\\n.*?)* がどれだけ長い文字列にマッチしようとも、バックトラックによって最も短い文字列になるまで切り詰められます。

オプションの定義

等号より後ろの部分がオプションというのは、正規表現の等号のあとにある三つの*のことを言っているのでしょうか。

概ね、その通りだと思います。
* は「0回以上の繰り返し」なので、「空文字として評価できる(あってもなくても良い)」という意味で「オプション」です。
ただし、\\\n.*? に関しては \\\n. が0文字に切り詰められないのでオプションとは呼べません。
その一つ外側で ()* が存在するので、そこで空文字として評価され、「オプション」となります。

Re: aaaaaaaa さん

投稿2017/07/26 11:13

編集2017/07/26 12:48
think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問