我知道负面观察必须是零宽度,但我注意到如果前面的标记是可选的,它们不起作用的问题。为什么会这样?
(?<!test):?(\\d{3})
test123
失败。
但通过test:123
除了(?<!test|test:)
之外,还有解决方法吗?我宁愿避免上述解决方案因为正则表达式我想应用它已经有很多负面的后置短语,我会加倍。
编辑:我最初是使用PCRE编辑器发布的,但是我使用ICU进行编码
答案 0 :(得分:1)
使用ICU正则表达式引擎,您可以访问约束宽度 lookbehind,允许在lookbehinds中使用限制已知长度的量词。
所以,使用
(?<!test:{0,1})\d{3}
^^^^^^
:{0,1}
将匹配一个或零:
。
请注意,ICU regex与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}]
)