3

私の問題は<div> xxx </div>、HTMLの任意のページ内からを削除したいということです。

だからページを与えられた...

<div> foo <div> bar <div> xxx </div> foo </div> bar </div>

で終わりたい

<div> foo <div> bar  foo </div> bar </div>

私はそれでreplaceFirst("<div.*?xxx.*?</div>", "")いいと思いました。私は魔法を引き受けましたか?試合を怠惰にし、最初のdivを残します。しかし、それは最初のdivから貪欲で一致することを主張しました。

解決策を見つけるのに1時間かかったので、次の回答を保存するために以下に回答を投稿します。

4

3 に答える 3

1

最後の<div>.

"<div>((?!<div>).)*?xxx((?!<div>).)*?</div>"

このような否定的なルックアラウンドを使用している場合は、そのタスクにより適したツールを見つけたほうがよいかもしれません。これは本当にアカデミックです。面白いかも。しかし、これと提供されているソリューションのいずれも、提供されている例から少しだけ複雑にするとうまくいきません。

ただし、それらの詳細については、ここに素晴らしい回答があります: 単語を含まない行に一致する正規表現?

于 2012-10-09T20:45:20.167 に答える
0

私が思いついた答えは

.replaceFirst("<div[^(div)]*?xxx.*?</div>", ""); // WARNING - THIS IS BROKEN !!!

より良い解決策があれば、私は喜んでそれを支持します。元のバージョンが機能しない理由はまだわかりませんが、すべてうまくいきました。

編集:多くの人が指摘しているように、内側のdivにdiまたはvが含まれている場合、上記の解決策は機能しません。

私は

.replaceFirst("(?s)(<div.*)<div.*xxx.*?</div>","$1");

コンセンサスは、正規表現とHTMLはキャベツとカスタードのようなものであるということです。それは良いアドバイスだと思いますが、私の具体的なシナリオは、(a)すべてのHTMLを制御できること、および(b)外部ライブラリを取り込むことができないことです。これらの特定の考慮事項を考えると、正規表現が私のために機能することは快適です。

以下の方にこのスレッドがお役に立てば幸いです。すべての貢献に感謝します。

于 2012-10-09T19:39:50.790 に答える
0

貪欲な一致は、期待どおりには機能しません。部分文字列の一致をできるだけ短くしようとしますが、最初に見つかったインスタンスから一致を開始します。また、パターン ドキュメント[^(div)]によると、 、、、、またはのいずれの文字とも一致しない で成功することは望ましくありません。div()

HTML で正規表現を使用しないことをお勧めします。文字通り、HTML をうまく解析できるほど表現力がありません。代わりに、HTML パーサーと XPath クエリを使用してください。

DIV に子がないことが確実な場合、最も近い近似は次のようにすることです。

.replaceFirst("<div[^<]+?xxx.*?</div>")

...ここで、[^<]+?前半が子タグを持つ DIV を見つけられないようにします。

于 2012-10-09T19:52:25.757 に答える