0

私はこの正規表現を持っています:

<li><i>(?:<a.*?>)?(.*)(?:<.*?>)?</i></li>

これで、これは次のテキストと一致するはずです。

<li><i><a href="hello.htm">Hi there</a></i></li>

または<a>タグなしで、次のように:

<li><i>42nd Street</i></li>

タグがなくても<a>、正規表現は問題なく機能します。問題は、最初の例では、次のように一致することです。

Hi there</a>

でのグループ化を無視することについて読んだことが(?:regex)ありますが、なぜそれが終了タグを含めることを主張するのかわかりません。</a>どの正規表現が終了</a>タグを無視するので、そこにのみこんにちはが表示されますか?

4

1 に答える 1

2

キャプチャしている(.*)ものは貪欲であり、(?:<.*?>)?その後はオプションであるため、(.*)には常にが含まれます</a>。これを修正するには、をに変更し.*.*?怠惰にします(できるだけ少ない文字に一致させます:

<li><i>(?:<a.*?>)?(.*?)(?:<.*?>)?</i></li>

ただし、正規表現を使用してHTMLを解析しないでください。

于 2012-06-10T21:04:23.763 に答える