2011-01-26 114 views
1

之間的文本我在文檔中的html標記中有一些文本。文本看起來像這樣如何刪除<參考>和< /參考>

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too 

I need this text &lt;ref Some random text /&gt; I need this text too 

如何,所以我刪除不需要的文本與封閉標籤一起?


我試過使用這個正則表達式。但它不起作用。

&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt; 

&lt;ref(.*?)&gt; 

在Java中嘗試這種方式是沒有幫助:

regex = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;"; 
p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE); 
m = p.matcher(s); 
while(m.find()){ 
    m.replaceAll(" ");   
} 

任何想法,我怎麼解決?

+0

實際的HTML標記不會使用實體標識符像< – 2011-01-26 17:38:40

+0

我錯過了補充一點,我有XML標記中的HTML格式的數據。 我解析了xml標籤,並檢索了html數據。除此之外,我需要刪除一些不需要的html標籤。這就是爲什麼HTML數據標記類似於<和> – 2011-01-26 17:46:16

回答

2

首先,使用HTML解析器。如果HTML變得複雜,正則表達式將無法可靠地處理此任務。

其次,你的正則表達式似乎良好和work as expected簡單的例子(一旦我改變&lt;<,那就是,但我懷疑你張貼的問題時,認爲StackOverflow上會曲解它所做的改變)。這個問題可能在你的Java代碼中,而不是正則表達式本身。我不熟悉Java的正則表達式的API,所以我讓別人權衡上:)

0
  1. HTML與正則表達式解析should be avoided

  2. 因爲你的是一個相對簡單的,所以我們說,我們去爲它。您正在匹配實際的HTML,因此您不需要&lt;,您需要實際的<(分別爲&gt;,>)。

    <ref[^>]*/>|<ref>[^<]*</ref> 
    

    應該做的伎倆,據我所知,我沒有用在Java中的正則表達式,但這樣如果有需要逃避它/我不知道。

0

字符串是不變的,所以replaceAll(),像任何其他「字符串不同誘變」方法,返回該結果作爲新的字符串。

String[] ss = { 
    "I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too", 
    "I need this text &lt;ref Some random text /&gt; I need this text too" 
}; 

String r = "&lt;ref(.*?)&gt;(.*?)&lt;/ref&gt;|&lt;ref(.*?)&gt;"; 

Pattern p = Pattern.compile(r, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
for (String s0 : ss) 
{ 
    Matcher m = p.matcher(s0); 
    String s1 = m.replaceAll(""); 
    System.out.printf("%n%s%n%s%n", s0, s1); 
} 

輸出:

I need this text &lt;ref&gt; Some unwanted text &lt;/ref&gt; I need this text too
I need this text I need this text too

I need this text &lt;ref Some random text /&gt; I need this text too
I need this text I need this text too

其他一些注意事項:

  • 當我整理你的正則表達式時,我不得不使用較長的一個作爲第一個替代方案。重要的是按順序進行嘗試,因爲較短的(對於空/自閉標籤)可以在不需要的標籤中進行匹配。

  • 您不需要撥打find();這是replaceAll()的第一件事。如果沒有匹配,它只是返回原始字符串。

  • MULTILINE標誌,未進行任何有用的,因爲在你的正則表達式沒有線錨(^$)(或礦)。

相關問題