2014-03-06 139 views
0

我試圖用Java編寫一個正則表達式,如下圖所示,以從<select>開始和選擇</>標籤的結束全部刪除。我寫了一個正則表達式,用於刪除從<start>標籤開始的所有內容,如下所示。問題是它除去了第四行<select name="first" ... the popular之外的所有內容。它會刪除該行中的所有內容,並忽略下一行and ... president"/>中的內容。我想包括從開始和結束標記的一切。我怎樣才能做到這一點?正則表達式去除特定HTML標籤

str.replaceAll(".*<start.*", ""); 

實際字符串str有如下內容:

<select name="id" content="2454803.html"/> 
<select name="nameid" content="2454803"/> 
<select name="type" content="prd"/> 
<select name="first" content="In 2004, Charlie, the popular 
and charismatic senator , became the first president"/> 
<select name="title" content="Charlie"/> 
<h1> 
<!--toc:insert content="checkbox" id="_1_0"/>--> 
</h1> 
<p class="tocline"><a href="2454803">Table of Contents</a></p> 
+0

您應該使用HTML解析器做那種東西 – fge

+0

應該有一個過濾器,只是將您重定向到[爲什麼這不起作用](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)當你在標題中加入'regex'和'html/xml'!這和我們需要一個*「關閉,因爲這是關於解析正則表達式的HTML」* –

+0

@fge這不是HTML本身。 Iam將這個整個html作爲一個字符串內容處理。 – user3161879

回答

2

正如評論所說,你真的不應該爲此使用正則表達式。但是,問題是默認情況下正則表達式中的點字符不匹配換行符。您必須在正則表達式的開始處包含(?)以使其可以這樣做。所以:

str.replaceAll("(?s)<select.*?/>", ""); 
+0

嗯,這將幾乎取代_every input_,其中沒有任何... ' – CAustin

0

我覺得你語句是

str.replaceAll(".*<select.*", ""); 

str.replaceAll(".*<start.*", ""); 

你需要前後<select

這樣的事情會搶來不顧一切標籤名稱(任何後面的任何東西)<

(?<=\<)start(?=(.*)) 

,或者你可以用

(?<=.)\<start(?=(.*)) 
2

<start根據Java文檔,在Pattern.html#lt

正則表達式.任何字符匹配除行終止,除非DOTALL標誌指定。

行結束符的含義:

  • 的換行(換行)字符('\n'),
  • 甲回車字符緊跟一個換行符("\r\n"),
  • 一個獨立的回車符('\r'),
  • 下一行字符('\u0085' ),
  • 甲線分隔符('\u2028'),或
  • 段落分隔符('\u2029)。

指定DOTALL標誌,最簡單的方法是將(?s)的正則表達式的開始。此外,還需要有一些改動,以適應這個標誌,所以最終的正則表達式將是(?s)<select.*?>\r?\n?,應用於像

str.replaceAll("(?s)<select.*?>\\r?\\n?", ""); 

示範這裏:http://regex101.com/r/bW8aR7

或者,你可以使用正則表達式<select[^>]*>\r?\n?,這樣:

str.replaceAll("<select[^>]*>\\r?\\n?", ""); 

示範這裏:http://regex101.com/r/lO6mQ6

+0

我試過str.replaceAll(「(?s) \\ r?\\ n?」,「」),如上所述,它對我很有幫助。 – user3161879