2012-09-11 33 views
4

早上好。我意識到有很多問題關於替換和replaceAll(),但我havnt見過這個。是否可以使用帶通配符的replaceAll()

我想要做的是解析一個字符串(其中包含有效的html到一個點),然後在字符串中看到<p>的第二個實例後,我想刪除以&開頭的所有內容並以;直到我看到未來</p>

做的第二部分,我希望利用沿s.replaceAll("&*;","")

這不工作線的東西,但希望它得到我的點對面,我尋找替代任何開頭&結束於;

+1

糾正我,如果我錯了,但我想你想「

」和「

」在這個問題上表現出了,對嗎?你會想編輯你的問題並將這些字符串標記爲cod然後他們會出現,如果是這樣的話。 –

回答

7

您應該將解析留給DOM解析器(see this question)。我幾乎可以保證你必須這樣做才能在<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;令牌和&.*?;版本可以有巨大的性能瓶頸結果。

1

你想表達的是:

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

但你真要解析HTML這樣?使用XML解析器可能會更好。

+0

我認爲OP表示他們希望在「

」的第二個實例到「

」之後發生這種情況...此代碼刪除(和包括)&中的字符串中的任何部分。 –

相關問題