我有以下两种形式的字符串输入。
1
<!--XYZdfdjf., 15456, hdfv.4002-->
<!DOCTYPE
2
<!--XYZdfdjf., 15456, hdfv.4002
<!DOCTYPE
如果遇到表单2并且与表单1不匹配,我想返回一个匹配项。
因此,基本上我想要一个正则表达式,任意接受<!--
和<!DOCTYPE
之间的所有字符,除非中间出现-->
。
我正在使用Pattern,Matcher和java正则表达式。 寻求帮助的是一个特别适用于Pattern.compile()
的正则表达式提前致谢。
答案 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