需要正则表达式帮助

时间:2010-10-06 12:59:47

标签: java regex groovy

我正在尝试使用以下模式替换两个或多个<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个(几个)空格?

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