2014-04-16 25 views
2

的java我有一個字符串:正則表達式用的replaceAll和多線

0000000000<table blalba>blaalb<tr>gfdg<td>kgdfkg</td></tr>fkkkkk</table>5555 

我想更換table/table用的文字:「」,刪除該文,只顯示00000000005555.

當它是一條線,它的工作原理:

chaineHtml = chaineHtml.replaceFirst("[^<title>](.*)[</title>$", ""); 

但隨着table同樣失敗。

回答

0

試試這個

s = s.replaceAll("<table.+/table>", ""); 
+0

你能解釋一下這段代碼嗎(在你的答案中)?你可能會得到更多的讚揚! –

+0

非常感謝它非常好!!!!它是偉大的它完美的作品,也感謝您的答覆一樣快! – sissi49

+0

@與帽子的傢伙它意味着替換以「」結尾爲「」(實際刪除)的文本 –

0
[^<table>] 

我不認爲這意味着什麼,你認爲它的意思。

它不是「不等於<表>」的字符串。相反,這意味着「字符不等於<或t或a或b或l或e或>」。 「[^ ...]」被稱爲negative character class

您正則表達式更改爲

(.*?)<table>.*?</table>(.*?) 

$1$2 

取代它,它會給你你想要的結果。


請考慮加書籤The Stack Overflow Regular Expeession FAQ以備將來參考。底部包含一個在線正則表達式測試器的列表,您可以自己嘗試一下。您可能還需要檢查出命名爲「字符類」,並且將部分通過@anubhava提到:「一般信息>不要使用正則表達式解析HTML」

+0

問題是樣本正則表達式不會與樣本輸入一起進行。 –

+0

@BheshGurung:意思是「表」。固定 – aliteralmind

+0

非常感謝您的回覆! – sissi49

3

此正則表達式應該工作:

html = html.replaceAll("(?is)<table.+?/table>", ""); 

其中(?is)將使其匹配多行並忽略大小寫。

但我建議你不應該使用正則表達式來操作HTML,因爲它可能容易出錯。

+0

同樣感謝您的回覆! – sissi49

0
String resultString = subjectString.replaceAll("<table.*?table>", ""); 

說明:

Match the characters 「<table」 literally «<table» 
Match any single character that is not a line break character «.*?» 
    Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?» 
Match the characters 「table>」 literally «table>» 
+0

非常感謝您的回覆! – sissi49

+0

不客氣! –

+0

單行答案不是很好的風格。請考慮添加解釋,特別是其他讀者會理解您的答案。 –

0

,如果你不熟悉它的概念,不要使用正則表達式!

有您的問題一個簡單的純Java解決方案:

String begin = "<table"; 
String end = "</table>"; 
String s = "0000000001<table blalba>blaalb<tr>gfdg<td>kgdfkg</td></tr>fkkkkk</table>4555"; 
int tableIndex = s.indexOf(begin); 
int tableEndIndex = s.indexOf(end, tableIndex); 

while (tableIndex > -1) { 
    s = s.substring(0, tableIndex) + s.substring(tableEndIndex + end.length()); 
    tableIndex = s.indexOf("<table"); 
    tableEndIndex = s.indexOf("</table>", tableIndex); 
} 
0

這裏是一個輝煌的解決方案,我在什麼地方找到: 使用正則表達式

[\s\S] 

,以適應任何字符,包括換行符因爲它適合任何空間或非空間字符。所以在你的情況下,會給:

s = s.replaceAll("<table[\\s\\S]+/table>", ""); 

雙反斜槓是爲了逃避反斜槓。

另一種可能是

(.|\n) 

這是其給出任何字符(除新行)或換行符:

s = s.replaceAll("<table(.|\n)+/table>", ""); 

出於某種原因,我的計算機上,在某些組合中,當我使用(.|\n)+正則表達式運行到一個奇怪的循環,並進入一個計算器:

線程「主」jav中的異常a.lang.StackOverflowError 在java.lang.Character.codePointAt(Character.java:4668) 在java.util.regex.Pattern中的$ CharProperty.match(Pattern.java:3693)

它沒有按」當我使用[\s\S\]+代替時會發生。但我不知道爲什麼。

相關問題