gpt4 book ai didi

java - 选择 anchor 标记而不是值的正则表达式

转载 作者:行者123 更新时间:2023-11-29 04:06:59 25 4
gpt4 key购买 nike

我需要正则表达式来选择除其值之外的完整 anchor 标记。

我试过使用下面的正则表达式但没有成功

(<a\s\b(href|title)\b.*\">)?|(<[\/]a>) for the below use cases

1.<a href=\"http://www.ags.ny.gov/\">www.ags.ny.gov</a>

2.<a title=\"ba.com/redeem\" href=\"http://ba.com/rertem\" target=\"_blank\" rel=\"nkiops noreferrer\">ba.com/rertem</a>.

3.<a href=\"http://www.dfs.ny.gov/\">www.ags.ay.gov</a>, for free information

我希望它的输出应该只选择以 title 或 href 开头的 anchor 标记,但是它在末尾选择 anchor 标记,尽管第一个条件不满足引用链接:https://regex101.com/r/VcAS6l/1

最佳答案

我假设您确实希望在较大的文档中查找 anchor 标记,并且您希望该过程准确且相对高效。

匹配包含(仅)特定类型的开始 anchor 标记结束 anchor 标记的字符串是没有用的。特别是因为在第一种情况下您没有检查它是否格式正确(请参阅关于 '=''"' 的评论)或在正则表达式中提取 anchor 的 URL。

让我们分析你的正则表达式:

  (<a\s\b(href|title)\b.*\">)?|(<[\/]a>) 

这是一个可选的组匹配 <a ...>标记 OR 匹配 <\a>非可选 组标签。它会愉快地匹配可选组的任何实例;即什么都没有。 ?可能放错地方了。

现在看这个

  <a\s\b(href|title)\b.*\">

也就是说:

  1. '<'
  2. 'a'
  3. 一个空格符
  4. 单词边界
  5. 一组由 "href" 组成或 "title"
  6. 单词边界
  7. 零个或多个字符
  8. '"'
  9. '>'

一个小问题是 4. 是多余的。

一个更大的问题是你没有明确匹配 '=''"'应该跟在 href 或 title 属性名称之后。

最大的问题在 7 中。 '*''.*'是一个贪婪量词。它会尝试匹配尽可能多的。所以实际上它会一直匹配到最后一个 '"'。和 '>'在你的文档中。这是错误的。

要解决最大的问题,您需要使用勉强 量词。匹配尽可能少的字符的一种。例如:

    .*?"

将(最初)在第一个 '"' 处停止匹配它看到的。


教训:

  1. 使用正则表达式来解析结构化文档是个坏主意。 HTML 特别困难,因为:

    • HTML 文档的语法中有太多合法的可变性
    • 您在野外发现的许多 HTML 文档都是格式错误的。

      相反,请使用适当的解析器。例如,Jsoup 解析器是解析可能在语法上无效的 HTML 文档的不错选择。它不会立即拒绝文档,而是会尝试(在内部)更正错误。

  2. 如果您要“借用”其他人的正则表达式,您将依赖于他们纠正正则表达式的能力,以及理解他们是否正确的能力正则表达式(真的)适用于您的问题。 (他们做对了吗?他们做出的假设在您的用例中是否有效?)

  3. 如果您打算尝试编写自己的正则表达式来解析复杂的文档,则需要了解 (Java) 正则表达式语言。有一些讨厌的陷阱;例如急切的量化和灾难性的回溯。

  4. 如果您必须调试正则表达式,您需要像对待任何其他代码调试问题一样对待它:

    • 确保您理解(正则表达式的)语言
    • 仔细阅读您的代码(正则表达式)。
    • 向您的 Rubber Duck 解释您的代码(正则表达式) . (不是开玩笑。)
    • 等等。

如果这听起来太难了,不要使用正则表达式来解决复杂的问题。

关于java - 选择 anchor 标记而不是值的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57940693/

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