gpt4 book ai didi

java - 用于查找 HTML 标记及其内容的正则表达式的否定 - java

转载 作者:行者123 更新时间:2023-11-27 22:55:32 24 4
gpt4 key购买 nike

我在 uni 做一个项目,我必须使用正则表达式清理一些 HTML 代码(我知道,这不是最好的方法......)

正文输入:

<h1>This is heading 1</h1>
<h2 style="color: aqua">This is heading 2</h2>
<h3>This is heading 3</h3>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<a href="https://www.w3schools.com">This is a link</a>
<ul>
<li>Coffee</li>
<li>Tea</li>
<li>Milk</li>
</ul>

我得到了一个允许的标签列表,我还必须删除所有其他标签及其内容。例如 {h3, p, ul}

首先,我删除了所有参数(它们是不允许的),然后我想到了这个正则表达式,它删除了标签和内容。

String regex = "(?i)<([h3|ul|p]+)>\\n?.*\\n?<\\/\\1>";

它有效,但现在我必须否定它并删除除...中给出的标签和内容之外的所有标签和内容

我试过了,但是没用:

`...[?!h3|ul|p]...`

此示例的预期结果:

<h3>This is heading 3</h3>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<ul>
</ul>

不太了解Negative Lookahead 以及如何将其应用到我的问题中,所以我将不胜感激任何建议。

最佳答案

您尝试使用的负面展望需要写成 (?!(?:h3|ul|p)\b)这不会选择 h3ulp标签。注意单词边界的使用\b在它之后以拒绝这些标签的完全匹配。除了删除这些标签之外,您还必须删除删除这些标签后留下的空格,因此总体而言,您需要使用的正则表达式是这样的,

\h*<(?!(?:h3|ul|p)\b)([^>]+).*?>[\w\W]*?</\1>\s*

正则表达式解释:

  • \h* - 匹配标签前的零个或多个水平空格(空格和制表符,可能还有其他存在的空格)
  • < - 标签开始
  • (?!(?:h3|ul|p)\b) - 否定预测以完全拒绝 h3 ulp标签
  • ([^>]+) - 匹配标签名称一个或多个字符并在 group1 中捕获以供稍后反向引用。你可以使用类似 \w+ 的东西或包含允许字符的字符集,以仅匹配您想要的字符。
  • .*?> - 可选择匹配零个或多个字符(基本上是属性),然后用 > 结束开始标记
  • [\w\W]*? - 以非贪婪方式匹配零个或多个字符,包括换行符
  • </\1> - 匹配 \1 处的标签结束代表之前匹配的作为标签名
  • \s* - 匹配零个或多个空格,这些空格基本上消耗了通过删除标签创建的空白空间

Regex Demo

Java 代码演示,

String s = "<h1>This is heading 1</h1>\r\n" + 
"<h2 style=\"color: aqua\">This is heading 2</h2>\r\n" +
"<h3>This is heading 3</h3>\r\n" +
"<p>This is a paragraph.</p>\r\n" +
"<p>This is another paragraph.</p>\r\n" +
"<a href=\"https://www.w3schools.com\">This is a link</a>\r\n" +
"<ul>\r\n" +
" <li>Coffee</li>\r\n" +
" <li>Tea</li>\r\n" +
" <li>Milk</li>\r\n" +
"</ul>";

System.out.println("Before:\n" + s);
System.out.println("\nAfter:\n" + s.replaceAll("\\h*<(?!(?:h3|ul|p)\\b)([^>]+).*?>[\\w\\W]*?</\\1>\\s*", ""));

输出,

Before:
<h1>This is heading 1</h1>
<h2 style="color: aqua">This is heading 2</h2>
<h3>This is heading 3</h3>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<a href="https://www.w3schools.com">This is a link</a>
<ul>
<li>Coffee</li>
<li>Tea</li>
<li>Milk</li>
</ul>

After:
<h3>This is heading 3</h3>
<p>This is a paragraph.</p>
<p>This is another paragraph.</p>
<ul>
</ul>

关于java - 用于查找 HTML 标记及其内容的正则表达式的否定 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56154516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com