###教えてほしいこと
正規表現.+?はどのような文字列を表すのでしょうか?
個々のメタキャラの意味は理解しております。
具体例も挙げていただければ嬉しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア1728
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
総合スコア4229
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/24 05:29