【问题标题】:Optimize Regex to extract content between two tags (or How to select content between two tags with Jsoup selector API?)优化正则表达式以提取两个标签之间的内容(或如何使用 Jsoup 选择器 API 选择两个标签之间的内容?)
【发布时间】:2014-02-25 23:49:05
【问题描述】:

我正在尝试创建一个正则表达式来从我们的文档站点中提取两个锚标记之间的内容。

我们以JDK wiki page 为例。我想提取“JDK 内容”和“JDK 和 SDK 之间的歧义”之间的内容。我目前的正则表达式是:

<span[^>]*\bid\s*=\s*(?:"|')?JDK_contents(?:'|")?[^>]*>([^<]*)</span>(.*?)
(<span[^>]*\bid\s*=\s*(?:"|')?Ambiguity_between_a_JDK_and_an_SDK(?:'|")?[^>]*>[^<]*</span>.*)

但由于这种正则表达式会执行多次,我想对其进行优化。

我可以考虑的一件事是.*?: &lt;/span&gt;(.*?)(&lt;span[^&gt;]...) 因为它会匹配任何东西,并导致很多回溯。

顺便说一句,我也尝试过贪婪版本:&lt;/span&gt;(.*)(&lt;span[^&gt;]...),但它要慢得多,因为.* 会匹配所有文本,然后回溯到Ambiguity_between_a_JDK_and_an_SDK 范围。

我正在使用 Java。谁能帮忙提供一些见解?

【问题讨论】:

标签: java html regex


【解决方案1】:

您可以使用 Jsoup 的 css 选择器实现相同的效果。

解决方案

h2:has(span#JDK_contents) ~ *:not(h2:has(span#Ambiguity_between_a_JDK_and_an_SDK) ~ *):not(h2)

DEMO

描述

为清楚起见,我们将h2Start 称为一个h2 标记,该标记具有至少一个ID 为JDK_contents 的跨度。我们也会调用 h2End 一个 h2 标签,它至少有一个带有 id Ambiguity_between_a_JDK_and_an_SDK 的 span。

h2:has(span#JDK_contents)  /* Select an h2Start */
~ *                        /* Select any node preceded by this h2Start... */
:not(h2:has(span#Ambiguity_between_a_JDK_and_an_SDK) ~ *) /* ...but not peceded by an h2End */
:not(h2) /* We remove h2End  */

注意: 对于JDK wiki page,最后一行就足够了。更严格地说,我们会将其替换为 :not(h2:has(span#Ambiguity_between_a_JDK_and_an_SDK))

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2010-09-22
    • 2020-06-22
    • 2023-03-28
    相关资源
    最近更新 更多