[英]Variable-Length Lookbehind not work in perl file, but work in one-liner
如果我將s/(?<!(?:href|src)=.{0,40})jpg//g
放在 perl 文件中,並嘗試運行它,它會給出警告: Variable length lookbehind is experimental in regex; marked by
Variable length lookbehind is experimental in regex; marked by
失敗。
但是如果放在 perl 單行中,它會成功運行,盡管仍然會警告Variable length lookbehind is experimental in regex; marked by
Variable length lookbehind is experimental in regex; marked by
。
是按照當前的設計還是我用錯了?
更新:我使用的是 perl 5.31.3
在 v5.30 之前,具有不確定的“可變寬度”模式的正向后視無法編譯,並出現“ Variable length lookbehind not implemented
錯誤。
在 v5.30 中,您可以使用最多可匹配 255 個字符的后視模式。
使用回溯斷言(如
(?<=foo?)
或(?<!ba{1,9}r)
之前會產生錯誤並拒絕編譯。現在編譯(如果最大回溯最多為 255 個字符) , 但會在新的experimental::vlb
警告類別中experimental::vlb
警告。這是為了提醒您准確的行為可能會根據現場使用的反饋而發生變化。
如果你使用(?<=WORD\\s+)
,你會得到一個Lookbehind longer than 255 not implemented
錯誤,因為正則表達式引擎需要提前知道子模式的長度不會長於 255 並且+
量詞有一個不確定的長度。 所以, (?<=WORD\\s{0,255})
會起作用。
在你的情況下,你知道你的后視模式永遠不會匹配超過 255 個字符,所以只需像任何其他實驗警告一樣轉換該實驗警告:
no warnings qw(experimental::vlb);
注:確保上述線路被放置在后use warnings;
行,如果存在,或者它不會有持久的影響,被use warnings;
覆蓋use warnings;
.
Perl 不關心代碼是通過-e
還是通過文件提供的。 代碼在兩種情況下的行為相同。 它失敗的原因不是因為您使用了在文件中而不是在命令行中發布的代碼。 您還沒有發現導致行為差異的另一個差異。
也就是說你不應該使用你發布的成本。 正如警告大聲宣布的那樣,這是一項實驗性功能。 它未經證實,因此可能存在問題。 此外,如有更改和刪除,恕不另行通知。
您可以通過使用以下代碼來消除對實驗性可變長度后視的使用:
s/(?:href|src).{0,40}(*SKIP)(*FAIL)|jpg//g
(*FAIL)
導致模式不匹配,從而觸發回溯。 但是(*SKIP)
使它在以后的嘗試中從(?:href|src).{0,40}
匹配的字符串之后的位置開始匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.