Java 需要正则表达式帮助
我试图用以下模式将两个或多个出现的Java 需要正则表达式帮助,java,regex,groovy,Java,Regex,Groovy,我试图用以下模式将两个或多个出现的(如)标记替换为两个 Pattern brTagPattern = Pattern.compile("(<\\s*br\\s*/\\s*>\\s*){2,}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Pattern brTagPattern=Pattern.compile(“(\\s*){2,}”, Pattern.CASE|u不敏感| Pattern.DOTALL); 但在某些情况下
(如
)标记替换为两个
Pattern brTagPattern = Pattern.compile("(<\\s*br\\s*/\\s*>\\s*){2,}",
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Pattern brTagPattern=Pattern.compile(“(\\s*){2,}”,
Pattern.CASE|u不敏感| Pattern.DOTALL);
但在某些情况下,“
”标记带有一个空格,它们被4个
标记替换,而实际上应该用2个标记替换
如何忽略标记之间的2或3(很少)个空格?下面是一些测试模式的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/>' )
}
import java.util.regex*
Pattern brTagPattern=Pattern.compile(“(\\s*){2,}”,Pattern.CASE|u不区分| Pattern.DOTALL)
def测试数据=[
['', ''],
['
','
'],
['
','
'],
['
,'
'],
['
,'
'],
['
,'
'],
['
,'
,
['
w
','
w
'],
]
testData.each{inputStr,应为->
Matcher Matcher=brTagPattern.Matcher(inputStr)
assert应为==matcher.replaceAll(“
”)
}
而且一切似乎都很顺利……可能不是您想要听到的答案,但一般认为,您不应该尝试使用正则表达式解析XML/HTML。很多事情都可能出错——使用专门针对此类数据的解析库是一个更好的主意,这也将完全绕过您遇到的问题
看看你是否确定你的HTML是格式良好的XML,或者如果HTML很可能是混乱和不一致的(就像大多数现实世界的HTML),你应该尝试类似的方法。你可以通过改变一点你的正则表达式来做到这一点:
Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>\\s*<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Pattern brTagPattern=Pattern.compile(“\\s*”,Pattern.CASE不区分大小写| Pattern.DOTALL);
这将忽略两个之间的所有空格。如果您只需要2或3个,可以使用:
Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>(\\s){2,3}<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Pattern brTagPattern=Pattern.compile(“(\\s){2,3}”,Pattern.CASE|u不敏感| Pattern.DOTALL);
这个正则表达式(即使它被用来解析HTML
)应该按原样工作。似乎有一个不同的问题。您能提供更多的上下文吗?可能不是您想要听到的答案,但一般认为您不应该尝试用正则表达式解析XML/HTML。很多事情都可能出错——使用专门针对此类数据的解析库是一个更好的主意,这也将完全绕过您遇到的问题。@Adrian:您能给我举个例子吗?@Arun:当然:)如果您确定您的HTML是格式良好的XML,请查看JAXB(),或者,如果HTML很可能是混乱和不一致的(像大多数现实世界的HTML),你应该尝试像TagSoup()这样的东西。我已经将我的评论转换成了答案,因为它们已经变成了一个:)+1,必要链接:谢谢,伙计……这只是我的一位同事向我提出的一个问题……我认为这是一个有效的问题……我猜是其他原因造成了这个问题……你的代码无法与
,你将返回
而不是
。问题请求仅忽略标记之间的空格。