我正在尝试使用以下模式替换两个或多个<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个(几个)空格?
答案 0 :(得分: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/>' )
}
一切似乎都过得很好......
答案 1 :(得分:1)
可能不是您想要听到的答案,但一般的智慧是您不应该尝试使用正则表达式解析XML / HTML。很多事情都可能出错 - 使用专门用于此类数据的解析库会更好,这也将完全绕过您遇到的问题。
如果您确定您的HTML是格式良好的XML,或者如果HTML可能很混乱(如大多数真实HTML),请查看JAXB,请尝试TagSoup 3}}
答案 2 :(得分:0)
你可以改变你的正则表达式:
Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>\\s*<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
这将忽略两个之间的每个空格。如果你只想要2或3,你可以使用:
Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>(\\s){2,3}<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);