我知道负后视的宽度必须为零,但我注意到一个问题,如果前面的令牌是可选的,它们不起作用。为什么会这样?
(?<!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}]
)