问题
我正在尝试使用一个带有正则表达式的jq v1.6过滤器,该过滤器包含一个负面的后视表达式和负面的前瞻性表达式,但是它们在Regex failure: invalid pattern in look-behind中失败了,尽管规范似乎是一个有效的表达式。
我使用的命令是
$ jq -n '("baz", "foo baz", "bla baz", "baz bars") | test("(?<!foo |bars )baz(?! foo| bars)")'
jq: error (at <unknown>): Regex failure: invalid pattern in look-behind似乎jq 1.6正在使用Onigurama库版本5.9.6 (https://github.com/stedolan/jq/commit/61edf3fa93f6177ef099b1b0cb2b49813a35c546#diff-ea6712465e6d2ae84a07da73f4ad6e25,这似乎是正确的脚本版本,因为jq 1.6是在2018年11月发布的,下一个提交compile-ios.sh的时间是到2019年12月)。
现在,我能找到的最近的文档来自5.9.1 (在https://github.com/kkos/oniguruma/commit/65a9b1aa03c9bc2dc01b074295b9603232cb3b78#中您可以搜索negative look-behind,doc/RE文件的第221行)。
(?后视镜必须有固定的字符长度.但是,不同的字符长度只允许在顶级的替代方案。例如。(?<=a|bc)是可以的。(?<=aaa(?:B\cd))是不允许的。 在消极展望中,不允许捕获组,但允许使用害羞组(?:)。
所以看来我的表情应该管用。
在测试了一些东西之后,我发现这是可行的:
jq -n '("baz", "foo baz", "bla baz", "baz bars") | test("(?<!foo|bar)baz(?! foo| bars)")'唯一的区别是,面向后的表达式选项是固定的宽度,但是docs清楚地指出,顶层的选项允许有可变的宽度。
结论
似乎出于某种原因,这个特定版本的jq不支持(负)后置表达式中的可变宽度替代方案,尽管规范没有提到这一点。
备注
我怀疑我安装的特定jq构建发生了什么变化,因为如果我尝试在https://stedolan.github.io/jq/manual/#RegularexpressionsPCRE中运行regex示例,也会得到一个错误:
$ jq -n '("test", "TEst", "teST", "TEST") | test( "(?i)te(?-i)st" )'
jq: error (at <unknown>): Regex failure: invalid group name <>有谁知道会有什么问题吗?
发布于 2020-09-30 23:02:14
如果您当前的库版本仅限于固定宽度的查找模式,则无法对其进行太多处理。
在您的例子中,由于您使用的是负查找,所以您可以不进行交替,只需将查找后分割成两部分:
(?<!foo )(?<!bars )baz(?! foo| bars)
^^^^^^^^^^^^^^^^^^^然后,您不需要关心每个查找后面需要检查多少个字符。
https://stackoverflow.com/questions/64146690
复制相似问题