Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要正则表达式帮助_Java_Regex_Groovy - Fatal编程技术网

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,必要链接:谢谢,伙计……这只是我的一位同事向我提出的一个问题……我认为这是一个有效的问题……我猜是其他原因造成了这个问题……你的代码无法与




,你将返回


而不是


。问题请求仅忽略
标记之间的空格。