繁体   English   中英

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

[英]How to exclude occurrence of a substring from a string using regex?

我在下面两个forms中有一个字符串输入。

1.

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

2.

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

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

我正在使用模式、匹配器和 java 正则表达式。 根据 Pattern.compile() 专用的正则表达式寻求帮助

提前致谢。

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

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

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

如果可能有两个或多个匹配项,并且您想单独查找它们,则可以将*替换为非贪婪*? ,像这样:

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

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

这似乎很容易通过使用String.contains()解决:

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

我觉得你看得太远了。

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

这使用负前瞻来防止-->和正前瞻来查找<!DOCTYPE Here's a good reference for atomic assertions (lookahead and behind)

我没有方便的测试系统,所以我不能给你正则表达式,但你应该在 Pattern 文档中查看称为negative lookahead assertion的东西。 这使您可以表达以下形式的规则:如果没有后跟,则匹配此。

它应该可以帮助你:)

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

具体来说,类似:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM