代码之家  ›  专栏  ›  技术社区  ›  sid_com

我应该如何处理标有“警告”的regex特性?

  •  1
  • sid_com  · 技术社区  · 14 年前

    我应该如何处理标有“warning”like“(”的regex特性?{code})”,“(??{code})或“特殊回溯控制动词”?我该多认真对待这些警告?

    1 回复  |  直到 14 年前
        1
  •  4
  •   tchrist    14 年前

    我觉得他们应该留在这里,不管怎样,特别是代码逃逸。代码泄漏已经伴随我们十多年了。

    他们能够以不可预见的方式调用代码的恐惧感是由 use re "eval" . 此外,regex matcher直到5.12iirc才开始出租,这可能会限制它们的实用性。

    字符串求值版本, (??{ code }) ,以前是进行递归的唯一方法,但自从5.10以来,我们有更好的方法来进行递归;对速度差异进行基准测试表明,在大多数情况下,eval方法要慢得多。

    我主要使用块评估版本, (?{ code}) ,用于添加调试,它发生在与 use re "debug" . 以前,块求值版本的返回值是不可用的,直到我意识到 . 您只需将其用作条件模式的测试部分,就像此模式用于测试一个数字是否由向右各位置递减一位的数字组成:

    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分起这些就一直在我们身边。