【问题标题】:Variable-Length Lookbehind not work in perl file, but work in one-liner可变长度 Lookbehind 在 perl 文件中不起作用,但在单行中起作用
【发布时间】:2021-02-13 13:17:36
【问题描述】:

如果我将s/(?<!(?:href|src)=.{0,40})jpg//g 放在一个perl 文件中,并尝试运行它,它会给出警告:Variable length lookbehind is experimental in regex; marked by 并且失败。

但如果放入 perl 单行程序,它将成功运行,尽管仍会收到 Variable length lookbehind is experimental in regex; marked by 的警告。

是目前的设计还是我用错了?

更新:我正在使用 perl 5.31.3

【问题讨论】:

  • 该消息是一个警告,它实际上不应该导致任何失败。要么您在脚本中启用了致命警告,要么问题实际上出在其他地方。
  • 我确实启用了致命警告。在我将其更改为use warnings; 或如Wiktor Stribiżew 指出的那样,添加no warnings qw(experimental::vlb); 后,它可以成功运行。

标签: regex perl regex-lookarounds lookbehind


【解决方案1】:

在 v5.30 之前,具有不确定的“可变宽度”模式的正向回溯无法编译并出现 Variable length lookbehind not implemented 错误。

在 v5.30 中,您 are allowed 使用最多可匹配 255 个字符的后向模式。

使用后向断言(如 (?<=foo?)(?<!ba{1,9}r) 以前会产生错误并拒绝编译。现在它 编译(如果最大后向是最多 255 个字符),但是 在新的experimental::vlb 警告类别中引发警告。这 是提醒您,确切的行为可能会根据变化 关于现场使用的反馈。

如果你使用(?<=WORD\s+),你会得到一个Lookbehind longer than 255 not implemented错误,因为正则表达式引擎需要提前知道子模式的长度不会超过255并且@ 987654328@ 量词的长度不确定。所以,(?<=WORD\s{0,255}) 会起作用。

在你的情况下,你知道你的后向模式永远不会匹配超过 255 个字符,所以只需像任何其他实验性警告一样打开实验性警告:

no warnings qw(experimental::vlb);

注意:请确保将上述行放在之后 use warnings; 行(如果存在),否则它将没有持久效果,被use warnings; 覆盖。

【讨论】:

  • 需要注意的是,作为实验性功能,它可能存在错误,可能会在不通知的情况下更改,也可能会在不通知的情况下被删除。
【解决方案2】:

Perl 不关心代码是通过-e 还是通过文件提供的。代码在这两种情况下的行为相同。它失败的原因不是因为您使用了在文件中而不是在命令行中发布的代码。您还没有发现导致行为差异的另一个差异。


也就是说,您不应该使用您发布的费用。正如警告大声宣布的那样,这是一个实验性功能。它未经证实,因此可能存在问题。此外,如有更改和删除,恕不另行通知。

您可以通过使用以下代码来消除对实验性可变长度后视的使用:

s/(?:href|src).{0,40}(*SKIP)(*FAIL)|jpg//g

(*FAIL) 导致模式不匹配,从而触发回溯。但是(*SKIP) 做到了,以便在以后的尝试中它将在(?:href|src).{0,40} 匹配的字符串之后的位置开始匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多