2010-10-06 265 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);