我该如何处理标有“警告”的正则表达式功能?

时间:2010-11-24 12:02:15

标签: regex perl warnings

我应该如何处理标有“警告”的正则表达式功能,如“(?{code})”,“(?? {code})”或“特殊回溯控制动词”?我应该多严肃地接受警告?

1 个答案:

答案 0 :(得分:4)

我认为他们会在这里停留,不管怎么说 - 尤其是代码逃脱。十多年来,代码逃脱一直伴随着我们。

use re "eval"照顾他们的可怕 - 他们可以用不可预见的方式调用代码。此外,正在使用正则表达式匹配器直到5.12 IIRC,这可能会限制它们的用途。

string-eval版本(??{ code })曾经是进行递归的唯一方法,但从5.10起我们有更好的方法来做到这一点;对速度差异进行基准测试表明,在大多数情况下,评估方式会慢一些。

我主要使用block-eval版本(?{ code})来添加调试,这种调试发生在与use re "debug"不同的粒度上。曾经模糊地打扰我,块eval版本的返回值不可用,直到我意识到。你只需要将它用作条件模式的测试部分,就像测试一个数字是否由数字组成的模式一样,每个位置向右减少一个数字:

qr{
  ^ (
      ( \p{Decimal_Number} )
      (?(?= ( \d )) | $)
      (?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
    ) $
}x

在我弄清条件之前,我会这样写:

qr{
   ^ (  
        ( \p{Decimal_Number} ) 
        (?= $ | (??{ chr(1+ord($2)) }) )
        (?: (?1) | $ ) 
    ) $
}x

效率低得多。

回溯控制动词更新。我主要使用它们来获取匹配的所有可能排列,并且只需要(*FAIL)。我相信这是(*ACCEPT)特征,特别标记为“高度实验性”。自5.10以来,这些只与我们同在。