🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
正規表現

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

Q&A

解決済

3回答

2908閲覧

正規表現の『.+?』について

shoooo

総合スコア34

正規表現

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

0グッド

0クリップ

投稿2019/12/02 05:06

php

1$data="<<a >script>"; 2$ans = preg_replace("/<[a-zA-Z]+.+?>/", "", $data); 3print($ans); // <script>

php

1$data="<<a>script>"; 2$ans = preg_replace("/<[a-zA-Z]+.+?>/", "", $data); 3print($ans); // <

②の挙動は納得がいくのですが、
①の場合スペースを入れるだけで、正規表現にマッチする理由がわかりません。
『.+?』は任意の1文字が1回以上連続した最短マッチというのはわかっているのですが
スペースが正規表現のどのメタ文字とマッチしているのかがわかりません。

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

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

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

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

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

Zuishin

2019/12/02 05:11

スペース一文字が任意の一文字でないというのはなぜでしょう?
guest

回答3

0

想定と違うと思うのは1ですね?

PHP

1<?PHP 2$data="<<a >script>"; 3$pattern="/<[a-zA-Z]+.+?>/"; 4preg_match($pattern,$data,$match); 5print htmlspecialchars($match[0])."<hr>"; 6$ans = preg_replace($pattern, "", $data); 7print htmlspecialchars($ans);

※「<」から始まって「アルファベット1文字以上」「なにか文字1文字以上」で「>」までですから
順番に「<」「a」「 」「>」がヒットして、先頭の「<」と末尾の「scrit>」がのこって
<script>」が得られます

投稿2019/12/02 05:18

yambejp

総合スコア116661

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

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

0

ベストアンサー

『.+?』は任意の1文字が1回以上連続した最短マッチというのはわかっているのですが

スペースが正規表現のどのメタ文字とマッチしているのかがわかりません。

スペースも「任意の1文字」に含まれます。

投稿2019/12/02 05:14

maisumakun

総合スコア145963

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

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

0

.+?がスペースにマッチする。

投稿2019/12/02 05:21

編集2019/12/07 04:36
shoooo

総合スコア34

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

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

momon-ga

2019/12/02 05:25

その回答(アルファベット以外の1回以上の繰り返し)だと $data="<<a>script>"; が、 print($ans); // < になる説明ができないのでは?
Zuishin

2019/12/02 05:33

アルファベット以外の条件なんて書かれていません。
think49

2019/12/07 04:55

この回答、なぜ-3評価なのでしょう? 間違ってはいないと思いますが。
maisumakun

2019/12/07 04:59

回答の履歴を見ると、間違った回答を(その旨の注記をせずに)直している状況でした。
Zuishin

2019/12/07 05:13

私のコメントも momon-ga さんではなく回答に向けたものですが、修正後の回答が質問の答えになっているかというと、なっていないのではないかと思います。 .+? がスペースにもマッチするというのは質問者も最初からわかってることで、どうしてスペースにマッチしているのかわからないという質問のはずです。
think49

2019/12/07 05:49

@Zuishin さん 「スペースが正規表現のどのメタ文字とマッチしているのかがわかりません」に対する解は「. がスペースにマッチする」であって、「.+?」では一つのメタキャラクタに絞り込めていないということですね。 理屈は分かりましたが、下記については疑問が残っていて、 > 私のコメントも momon-ga さんではなく回答に向けたものですが、 「アルファベット以外の条件なんて書かれていません。」が「.+?がスペースにマッチする。」に向けたものといわれると、「回答のどこにもアルファベットなんて書いていません」と思ってしまいますね…。 2019/12/02 14:33時点ではこの回答だったとは思うのですが、修正前の回答を見て、コメントを書くまでの間に回答が修正されてしまったのでしょうか。
Zuishin

2019/12/07 07:10

あれは前の回答に対するコメントでしたが、修正後も maisumakun さんの回答を劣化させて大事なところを削っただけなので、評価を変えていません。 私のコメントは 2 日なので、回答が修正された 7 日までは特におかしいとは思いませんでしたが、今読み直すと momon-ga さんへのコメントのように取れるので補足しました。
momon-ga

2019/12/10 01:32

タイムスタンプ見れば、修正前の内容に関するコメントだとはわかるのですが、普通そこまで確認するのも面倒なので、回答修正するさいに元のやつを残して(取り消し線を使う)欲しいです。 > shooooさん
think49

2019/12/10 03:34

@Zuishin さん すみません。 コメントから5日後に回答が修正されて整合性がとれなくなっていたのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問