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

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

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

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

Q&A

解決済

3回答

2512閲覧

正規表現 .+?

Matt

総合スコア41

正規表現

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

0グッド

0クリップ

投稿2016/10/24 05:05

###教えてほしいこと
正規表現.+?はどのような文字列を表すのでしょうか?
個々のメタキャラの意味は理解しております。
具体例も挙げていただければ嬉しいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

?量指定子 としての ? (直前の文字が0回もしくは1回)もありますが、 最小量指定子 にするためにも使います。

つまり量指定子 *, +, ?, {n,}, {,m}, {n,m} は後ろに ? をつけて
*?, +?, ??, {n,}?, {,m}?, {n,m}? にすると最小量指定子になります。

量指定子 * を使って

<b>x</b>y<b>z</b>

/<b>.*<\/b>/

とすると <b>x</b>y<b>z</b> にマッチしますが

最小量指定子 *? を使って

<b>x</b>y<b>z</b>

/<b>.*?<\/b>/

とすると <b>x</b> にマッチします。

便利!!!!

投稿2016/10/24 05:20

編集2016/10/24 05:30
hana-da

総合スコア1728

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

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

Matt

2016/10/24 05:29

理解できました、ありがとうございます!
guest

0

正規表現には、次の基本原則があります。

  • 正規表現の各々の部分表現は、最左の、最長で、重なり合わない範囲にマッチする。

たとえば

0123

というテキストに対して、.*.+という正規表現でマッチさせることを考えます。この場合、前の部分表現.*はまず、テキストの最初から (最左) テキストの最後までマッチしようとします (最長) が、それでは後の.+がマッチするものがなくなってしまうので、後戻りして012までだけマッチします (このように、後戻りして最長よりも妥協する動作を「バックトラック」といいます)。そして、後の部分表現.+はテキストの残りにマッチし (重なり合わない)、正規表現全体のマッチが完了します。

量化子 (量指定子とも言います) のうち、?*+などは、上の原則通りに動作します。これらは、マッチする範囲を最長にしようとすることから「貪欲な」量化子であると言われることがあります。一方「貪欲でない」量化子??*?+?は、基本原則と少し違い、マッチする範囲を最長の中でも最短にしようとします。

たとえば、よくある質問に「HTMLのタグにマッチする正規表現を教えて下さい」というものがあります。このような正規表現を<[a-z]+.*>と回答すると間違いです。これは

lang

1<!DOCTYPE html><html lang="ja"><head></head><body></body></html> 2

というテキストでは「<html」から後の全てにマッチしてしまいます。「貪欲でない」量化子を使って<[a-z]+.*?>とすれば、.*?が最短でマッチするので「<html lang="ja">」にマッチしますし、そのあとにまた<[a-z]+.*?>があれば「<head>」にマッチしますね。

なお、さらに「強欲な」量化子として?+*+++を実装しているシステムもあります。これはマッチする範囲を最長にしてバックトラックもしないという動作をします (詳しい説明は略します)。

「貪欲でない」量化子や「強欲な」量化子は、拡張仕様であるため、すべてのシステムで使えるわけではありません。また、マッチの範囲をコントロールするためにこれらを多用すると、もともとわかりにくい正規表現 (正規表現というのはそういうものです) が、ますますわかりにくくなってしまいます。どうしてもこれらの量化子が必要になってしまうのなら、正規表現をやめて、かわりに構文解析などの技法を使うことも検討したほうがいいと思います。

投稿2016/10/24 07:29

ikedas

総合スコア4229

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

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

ikedas

2016/10/24 07:30

あっ、解決ずみになってしまった。あと、.+?ではなくて.*?の説明になってしまった。
guest

0

.+?文字

として、一番最初にでてくる「文字」の直前にある1文字以上の文字です。

abcXYZdefXYZghiに(.+?)XYZとすればカッコの部分はabcを指します
(最短マッチなのでdefではない)

投稿2016/10/24 05:10

yambejp

総合スコア114585

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

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

Matt

2016/10/24 05:18

?は直前文字を0回か1回繰り返すのは知っていましたが、最短マッチを表すという使い方が別にあるという解釈でよろしいのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問