2011-11-10 20 views
1

匹配整個標籤我想使用此代碼使用正則表達式在Java中來匹配這個<a href="**something**">正則表達式 - 在java中

Pattern regex = Pattern.compile("<([a-z]+) *[^/]*?>"); 
       Matcher matcher = regex.matcher(string); 
       string= matcher.replaceAll(""); 

我不是很熟悉的正則表達式。我究竟做錯了什麼?由於

+2

你做錯了的主要事情是使用正則表達式來解析html。這是錯誤的工具。 –

+0

你想完成什麼? – Krylez

+2

你期待什麼發生?究竟發生了什麼? –

回答

4

如果你只是想找到起始標籤,你可以使用:

"<a(?=[>\\s])[^>]*>" 

如果您想獲得href屬性倒不如使用:

"<a\\s+[^>]*href=(['\"])(.*?)\\1[^>]*>" 

這將捕獲鏈接到捕獲組2中。

+0

其實這個比較好匹配整個開始標籤'「 \\ s])(([^>」'] *)|(([''])。*?\\ 4))*>「因爲它允許在屬性中使用'>'。當一個屬性包含'>' –

+0

時,我還沒有能夠匹配href屬性的模式。明白了。這將捕獲href屬性值到捕獲組4. [' \\ s])((\\ s + href =([「'])(。*?)\\ 3)|([^>」' ])|(([''])。*?\\ 7))*>「' –

+0

感謝兩種可能性 – simPod

3

你可以對陣:

"<a[^>]*>" 

如果*是java的「貪婪」(我想是的,這是正確的) 但你不能匹配< a whatever="foo" >這一說法,因爲空格。

雖然下面是更好的,但更復雜的理解:

"<\\s*a\\s+[^>]*>" 

(需要雙\\因爲\是一個java字符串特殊字符)

該處理前的可選空格並在a之後至少有一個空格。 所以你不匹配<abcdef>這不是一個正確的標籤。 (我假設你的標籤站在一條線上,並且你沒有啓用多線模式,否則它會變得更加複雜)。 你最後的*[^/]*?>看起來有點奇怪,也許它不起作用。 。

確定可以檢查你正在做什麼:

<([a-z]+) *[^/]*?> 

<([a-z]+) 

匹配的東西,包含<接着是[A-Z]至少一次。這由括號分組。

現在您使用的是*這意味着定義的組([a-z])*可能會出現多次,或者不會。

[^/]* 

這意味着現在很百搭,但/或沒有(因爲*)的

問號是錯誤的,不知道該如何解釋。

最後一個字符>與最後一個元素匹配,必須出現。

綜上所述,你的表達是錯誤的,不能工作:)

看看:http://www.regular-expressions.info/

這是一個很好的起點。

+0

這似乎是FaildDev答案的一個克隆。在那裏看看我的評論爲什麼它是錯的。 –

+0

好的,我自己分析一下。我糾正那麼遠嗎? – evildead

+0

啊好吧明白你的意思。我們幾乎在同一時間發帖,在回答問題時看到一篇帖子出現。 – evildead

4

爲了讓您瞭解人們爲什麼總是說「不要嘗試用正則表達式解析HTML」,這裏是簡化的正則表達式的<a>標籤匹配:

<\s*a(?:\s+[a-z]+(?:\s*=\s*(?:[a-z0-9]+|"[^"]*"|'[^']*'))?)*\s*> 

它實際上是可能的標籤的使用正則表達式匹配。它並不像大多數人所期望的那麼容易。

另一方面,所有的HTML都不是「常規」的,所以你不能用正則表達式來完成。 (許多/大多數語言中的「正則表達式」支持實際上比「常規」支持更強大,但很少有足夠強大的功能來處理HTML等平衡結構。)

下面是上述表達式的細節:

<\s*    < and possibly some spaces 
a    "a" 
(?:    0 or more... 
    \s+    some spaces 
    [a-z]+   attribute name (simplified) 
    (?:    and maybe... 
    \s*=\s*   an equal sign, possibly with surrounding spaces 
    (?:    and one of: 
     [a-z0-9]+  - a simple attribute value (simplified) 
     |"[^"]*"   - a double-quoted attr value 
     |'[^']*'   - a single quoted atttr value 
    ) 
)? 
)* 
\s*>    possibly more spaces and then > 

(在每個組的開始評論也談運營商在 組的結束,甚至在該組中。)

這裏還有其他可能的簡化 - 我寫的這從 內存,而不是從規格。即使你遵循規範,瀏覽器的容錯性也會更大,並會接受各種無效輸入。

+0

多數民衆贊成如此真實:) – evildead

+0

非常感謝這個參數列表,它會幫助我進入正則表達式 – simPod