2016-04-03 17 views
6

ウェブページ内のアンカーリンクを検索しているとします。動作する正規表現は次のとおりです。私のregex式は怠惰で貪欲です。どうして?

"\<a\s+.*?\>" 

ただし、合併症を追加できます。たとえば、「next」という単語のような特定のテキストを囲むリンクのみが必要な場合を考えてみましょう。通常、私は私がしなければならなかったすべてがあると思うだろう:

"\<a\s+.*?\>next" 

しかし、私は今、3個のアンカータグがページ内に存在する場合、そして三番目は、正規表現検索することを、それの後に「次へ」を持っていることがわかります最初のアンカータグから拡張して3番目のアンカータグまで拡張する巨大な文字列を見つけます。これは、アスタリスククエスチョンマークがすべての文字を「> next」に渡るまで見つけると意味があります。しかし、それは私が望むものではありません。すべての文字が「>」にわたるまで検索したいのですが、追加の制約は「>」の直後に「next」があるはずです。

これを動作させるにはどうすればよいですか?

答えて

6

あなたはすなわち[^>].を交換することにより、タグ内>に一致するからそれを禁止することによって、あなたの正規表現を修正することができます:

"\<a\s+[^>]*?\>next" 

.*?は、任意の数の文字に一致します。あなたが消極的になったという事実は、それが>に止まることはありません。最後に>nextが見つかるまで、それはそれを超えて一致し続けます。これは貪欲ではありません。なぜなら、表現は一致を得るためにできるだけ一致しないからです。それより短いマッチは利用できなかったということだけです。

Demo.

関連する問題