如果我将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
答案 0 :(得分:2)
在v5.30之前,带有不确定的“可变宽度”模式的正向后视无法编译,并出现 Variable length lookbehind not implemented
错误。
在v5.30中,您are now allowed使用的后备模式最多可匹配255个字符。
使用后置断言(例如
(?<=foo?)
或(?<!ba{1,9}r)
以前会产生错误并拒绝编译。现在它 编译(如果后面的最大回溯数最多为255个字符),但是 在新的experimental::vlb
警告类别中引发警告。这个 是为了提醒您,准确的行为可能会根据更改而有所变化 现场使用的反馈。
如果您使用(?<=WORD\s+)
,则会收到 Lookbehind longer than 255 not implemented
错误,因为正则表达式引擎需要提前知道子模式的长度不会超过255,+
量词的长度不确定。因此,(?<=WORD\s{0,255})
可以工作。
以您为例,您知道后向模式永远不会匹配超过255个字符,因此只需像其他任何实验警告一样打开该实验警告即可:
no warnings qw(experimental::vlb);
答案 1 :(得分:0)
Perl不在乎代码是通过-e
还是通过文件提供的。该代码在两种情况下的行为相同。失败的原因不是因为您使用了在文件中而不是在命令行中发布的代码。您还没有发现另一个导致行为差异的差异。
那表示您不应该使用您发布的费用。正如警告大声宣布的那样,这是一项实验功能。它未经证实,因此可能有问题。另外,它可能会更改和删除,恕不另行通知。
您可以改为使用以下代码来消除使用实验性的变长后视:
s/(?:href|src).{0,40}(*SKIP)(*FAIL)|jpg//g
(*FAIL)
导致模式不匹配,从而触发回溯。但是(*SKIP)
做到了这一点,以便在以后的尝试中它将在与(?:href|src).{0,40}
匹配的字符串之后的位置开始匹配。