什么是让负面的lookbehind与可选值一起工作的最有效方法?

时间:2016-03-21 10:00:44

标签: regex optional icu negative-lookbehind

我知道负面观察必须是零宽度,但我注意到如果前面的标记是可选的,它们不起作用的问题。为什么会这样?

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

test123失败。 但通过test:123

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

编辑:我最初是使用PCRE编辑器发布的,但是我使用ICU进行编码

1 个答案:

答案 0 :(得分:1)

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

所以,使用

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

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

请注意,ICU regexPCRE的工作方式不同,您应该了解在不兼容的环境中进行测试时的差异,例如regex101.com

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

  • (*SKIP)(*FAIL)动词
  • \K运营商

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

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