获得负面回溯以处理可选值的最有效方法是什么



我知道负后视的宽度必须为零,但我注意到一个问题,如果前面的令牌是可选的,它们不起作用。为什么会这样?

(?<!test):?(\d{3})

test123失败。但过去test:123

除了(?<!test|test:)之外,还有其他解决方案吗?我宁愿避免上述解决方案,因为我想将其应用于的正则表达式已经有很多负面的后视短语,我会加倍。

编辑:我最初使用PCRE编辑器发布此内容,但我正在使用ICU编码

使用 ICU 正则表达式引擎,您可以访问约束宽度的后视,该回溯允许在后视中使用已知长度的限制量词

所以,使用

(?<!test:{0,1})d{3}
        ^^^^^^

:{0,1}将匹配一个或零个:

请注意,ICU 正则表达式的工作方式与 PCRE 不同,在不兼容的环境(例如 regex101.com)中进行测试时,您应该注意差异。

ICU中缺少的一些很酷的PCRE功能:

  • (*SKIP)(*FAIL)动词
  • K运算符

PCRE 中缺少一些很酷的 ICU 功能:

  • 受约束的宽度后视 ( (?<!test:{0,1})d{3}
  • 字符类交集 ( [p{Letter}&&p{script=cyrillic}] ) 或减法 ( [p{Letter}--p{script=latin}]

相关内容

最新更新