需要正则表达式帮助

我试图将两个或更多个(如同一个)标签的出现和两个

更换用以下模式替换

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

但是在某些情况下,’

‘标签带有空格,并且它们被4个标签取代,实际上应该用2个标签代替。

我该怎么做才能忽略标签之间的2或3(几个)空格?

可能不是您想要听到的答案,但一般的智慧是您不应该尝试使用正则表达式解析XML / HTML。 很多事情都可能出错 – 使用专门用于此类数据的解析库是一个更好的主意,这也将完全绕过您遇到的问题。

如果您确定您的HTML是格式良好的XML,或者如果HTML可能很混乱(如大多数真实HTML),那么您应该尝试像TagSoup这样的东西,看看JAXB 。

这是一些用于测试模式的Groovy代码:

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

'], ['


', '

'], ['
< br/ >
', '

'], ['


', '

'], ['




', '

'], ['


w
','

w
'], ] testData.each { inputStr, expected -> Matcher matcher = brTagPattern.matcher( inputStr ) assert expected == matcher.replaceAll( '

' ) }

一切似乎都过得很好……

你可以改变你的正则表达式:

 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);