如何使用正则表达式从字符串中排除子串的出现?

时间:2011-06-09 21:29:02

标签: java regex

我有以下两种形式的字符串输入。

1

<!--XYZdfdjf., 15456, hdfv.4002-->
<!DOCTYPE

2

<!--XYZdfdjf., 15456, hdfv.4002
<!DOCTYPE

如果遇到表单2并且与表单1不匹配,我想返回一个匹配项。 因此,基本上我想要一个正则表达式,任意接受<!--<!DOCTYPE之间的所有字符,除非中间出现-->

我正在使用Pattern,Matcher和java正则表达式。 寻求帮助的是一个特别适用于Pattern.compile()

的正则表达式

提前致谢。

5 个答案:

答案 0 :(得分:4)

Pattern p = Pattern.compile("(?s)<!--(?:(?!-->).)*<!DOCTYPE");

(?:(?!-->).)*一次匹配一个字符,之后检查它不是-->的第一个字符。

(?s)设置DOTALL模式(a.k.a。单行模式),允许.匹配换行符。

如果有两个或更多匹配的可能性并且您想要单独找到它们,则可以将*替换为非贪婪的*?,如下所示:

"(?s)<!--(?:(?!-->).)*?<!DOCTYPE"

例如,将该正则表达式应用于您的问题文本将找到两个匹配项,而原始正则表达式将找到一个更长的匹配项。

答案 1 :(得分:3)

这似乎可以通过String.contains()

轻松解决
if (yourHtml.contains("-->")) {
    // exclude
} else {
    // extract the content you need
    String content = 
        yourHtml.substring("<!--".length(), yourHtml.indexOf("<!DOCTYPE"));
}

我认为你看得太过分了。

答案 2 :(得分:2)

\<!--([\s\S](?!--\>))*?(?=\<\!DOCTYPE)

这使用负向前瞻来阻止 - &gt; 和积极的前瞻来找到&lt;!DOCTYPE 这是atomic assertions (lookahead and behind)的一个很好的参考。

答案 3 :(得分:1)

我没有一个方便的测试系统,所以我不能给你正则表达式,但你应该在Pattern文档中查看一个名为negative lookahead assertion的东西。这允许您表达表单的规则:如果没有,则匹配此。

它可以帮助你:)

答案 4 :(得分:1)

正则表达式可能不是您问题的最佳答案。您是否尝试将第一行与其他所有内容分开并查看它是否包含-->

特别是:

String htmlString;
String firstLine = htmlString.split("\r?\n")[0];
if(firstLine.contains("-->"))
    ;//no match
//match