2010-10-06 150 views
1

我試圖取代的<br/>兩個或多個字符的字符串(如<br/><br/><br/>)有兩個<br/><br/>一起變量與下面的模式正則表達式幫助需要

Pattern brTagPattern = Pattern.compile("(<\\s*br\\s*/\\s*>\\s*){2,}", 
    Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 

但也有一些情況下,「<br/> <br/>」標籤來用空間,他們被替換爲4 <br/>標籤,實際上應該用2個標籤替換。

我能做些什麼來忽略標籤之間出現的2或3個(少數)空格?

+4

此正則表達式(即使它被用來解析HTML'')應該工作原樣。似乎有一個不同的問題。你能提供更多的上下文嗎? – 2010-10-06 13:06:58

+2

可能不是您想要聽到的答案,但您應該*不*嘗試使用正則表達式解析XML/HTML是一般智慧。很多事情可能會出錯 - 使用專門用於此類數據的解析庫是一個更好的主意,這也將完全繞過您遇到的問題。 – 2010-10-06 13:07:03

+0

@Adrian:你能舉個例子嗎? – 2010-10-06 13:48:38

回答

1

可能不是你想要聽到的答案,但它是一般的智慧,你應該不要試圖用正則表達式解析XML/HTML。很多事情可能會出錯 - 使用專門用於此類數據的解析庫是一個更好的主意,這也將完全繞過您遇到的問題。

看看JAXB如果你確定你的HTML是格式良好的XML,或者HTML可能是混亂和不兼容的(就像大多數真實世界的HTML),你應該嘗試類似TagSoup

+0

+1和必要的鏈接:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-10-06 14:02:32

1

下面是一些Groovy代碼來測試你的模式:

import java.util.regex.* 

Pattern brTagPattern = Pattern.compile("(<\\s*br\\s*/\\s*>\\s*){2,}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL) 
def testData = [ 
    ['',       ''], 
    ['<br/>',      '<br/>'], 
    ['< br/> <br />',    '<br/><br/>'], 
    ['<br/> <br/><br/>',   '<br/><br/>'], 
    ['<br/> <br/> <br/>',  '<br/><br/>'], 
    ['<br/> <br/> <br/>',   '<br/><br/>'], 
    ['<br/><br/><br/> <br/><br/>', '<br/><br/>'], 
    ['<br/><br/><br/><b>w</b><br/>','<br/><br/><b>w</b><br/>'], 
] 

testData.each { inputStr, expected -> 
    Matcher matcher = brTagPattern.matcher(inputStr) 
    assert expected == matcher.replaceAll('<br/><br/>') 
} 

,一切似乎精細遍......

+0

感謝好友......這只是我的一位同事向我提出的一個問題..我認爲這是一個有效的問題......猜猜別的東西導致了這個問題... – 2010-10-06 15:04:02

+0

您的代碼將無法與'


hello',喲你會返回'

你好'而不是'

hello'。該問題請求忽略*
標記之間的空格。 – greuze 2010-10-08 08:35:50

0

你可以做,改變一點點您正則表達式:

Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>\\s*<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 

這會忽略2
之間的每一個空間。如果你只是想正好2或三個,你可以使用:

Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>(\\s){2,3}<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);