4

おはようございます。置換に関してたくさんの質問があることを認識していますが、replaceAll()これを見たことはありません。

私がやろうとしているのは、文字列(有効なhtmlを含む)を解析し、文字列<p>内の2番目のインスタンスを確認した後、 & で始まり ; で終わるすべてを削除したいことです。次を見るまで</p>

2番目の部分を行うために、次のようなものを使用したいと思っていましたs.replaceAll("&*;","")

それはうまくいきませんが、 & で始まり ; で終わるものをすべて置き換えようとしているという私の主張が伝わることを願っています。

4

2 に答える 2

9

おそらく、解析は DOM パーサーに任せるべきです (この質問を参照してください)。<p>タグ内のテキストを見つけるためにこれを行う必要があることはほぼ保証できます。

置換ロジックにString.replaceAllは、必要なマッチングを実行できる正規表現を使用します。

必要な正規表現の「ワイルドカード」は.*式です。あなたの例を使用して:

String ampStr = "This &escape;String";
String removed = ampStr.replaceAll("&.*;", "");
System.out.println(removed);

これは を出力しますThis String。は.任意の文字を表し、*は「この文字が 0 回以上」を意味するためです。つまり、.*基本的には「任意の数の文字」を意味します。ただし、次のように供給します。

"This &escape;String &anotherescape;Extended"

おそらくあなたが望むことをしないでしょう、そしてそれは出力しますThis Extended. これを修正するには、文字の代わりに探したいものを正確に指定します.。これは 「セミコロン[^;]以外の任意の文字:

String removed = ampStr.replaceAll("&[^;]*;", "");

これは、一致しない文字列よりもパフォーマンス上の利点が&.*?;あるため、このバージョンを使用することを強くお勧めします。特に、すべての HTML ファイルに&abc;トークンが含まれるわけではなく&.*?;、結果としてパフォーマンスの大きなボトルネックになる可能性があるためです。

于 2012-09-11T20:13:08.873 に答える
1

必要な式は次のとおりです。

s.replaceAll("&.*?;","");

しかし、本当にこの方法で HTML を解析したいですか? XML パーサーを使用した方がよい場合があります。

于 2012-09-11T20:03:28.510 に答える