【问题标题】:Negative lookahead Regex Issue负前瞻正则表达式问题
【发布时间】:2018-04-03 02:15:11
【问题描述】:

我开始寻找前瞻并尝试创建一个简单的示例,但由于某种原因,当我尝试使用负前瞻时它无法正常工作。

我有以下简单的正则表达式:

href="(.+?)"(?!\s)

还有这个字符串:

<a href="test.com">test</a> 
<a href="test.com" title="title">test</a>

测试环境:https://regex101.com/r/JztPUe/1

我只是在没有空格的情况下才尝试在 href 之间获取 URL,但它似乎并没有理解我,因为它正在获取第一个和第二个 URL。

当我将其更改为正向预测时,它会正常工作,并且只需要第二个 URL,但负向预测没有按预期工作。

谁能指出我的错误在哪里?

【问题讨论】:

  • 这是一个很好的例子,说明了为什么正则表达式根本不适合任何类型的解析。
  • 即使.+? 是惰性的,它仍然会扩展直到找到匹配项。您可以将"(.+?)" 转换为原子组(?&gt;"(.+?)") 或使用否定字符类[^"]+ 来避免空间扩展。但基本上你不应该用正则表达式解析 HTML,除非你有一段非常明确的 html。
  • @Siguza 感谢您的评论。我不会将它用于任何解析(至少现在)。我只是想了解前瞻是如何工作的,但是由于我的示例无法正常工作,因此我目前的理解似乎是错误的。
  • 我同意@Siguza。举个例子:regex101.com/r/JztPUe/4
  • @Sebastian Proske 和 @hek2mgl 感谢 cmets。我将避免经常使用.+,并更具体地针对它。至于我使用的字符串,这是我在考虑添加示例字符串时首先想到的,没有具体原因是它是 HTML。 :)

标签: regex


【解决方案1】:

您应该考虑使用 HTML 解析器,而不是尝试使用正则表达式。话虽如此,您可以坚持href 子句后面的内容不是空格来表达您的正则表达式:

href="([^"]*)"[^ ]

Demo

您当前的正则表达式:

href="(.+?)"(?!\s)

在 Regex 101 中按预期工作,稍微改写如下:

href="([^"]*)"(?!\s)

Demo

您遇到的问题似乎是由于您的演示中的正则表达式不支持惰性点(.+?) 引起的。这是一个 Perl 扩展,并非所有引擎都支持。

【讨论】:

  • 感谢您的回答。你是完全正确的,如果这样做的话它会起作用,但问题不在于我不知道如何正确地定位 href,而是我试图了解它是如何在我使用前瞻时失败的。 :)(我会给你+1,但我需要 15 个代表)
  • @Noobie 问题是你向前看,但你永远不会匹配任何东西。
  • 我在regex101.com/r/JztPUe/5 尝试了最后一个示例,但似乎问题仍然存在。我确实尝试在前瞻\stitle 中添加标题,但问题仍然相同。
  • @Noobie 问题在于演示中使用的正则表达式的味道,它不支持惰性点。
  • 实际上与前瞻后缺少匹配字符无关(作为结束模式的前瞻是完全合法和实用的)。
【解决方案2】:

有空格href="\K(\S+)"\s\Kdemo

没有空格href="\K(\S+)"&gt;\Kdemo


\K 转义字符串序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多