首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JQ1.6/oniguruma 5.9.6抛出"Regex故障:后面的无效模式“错误

JQ1.6/oniguruma 5.9.6抛出"Regex故障:后面的无效模式“错误
EN

Stack Overflow用户
提问于 2020-09-30 22:37:23
回答 1查看 190关注 0票数 1

问题

我正在尝试使用一个带有正则表达式的jq v1.6过滤器,该过滤器包含一个负面的后视表达式和负面的前瞻性表达式,但是它们在Regex failure: invalid pattern in look-behind中失败了,尽管规范似乎是一个有效的表达式。

我使用的命令是

代码语言:javascript
复制
$ 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-behinddoc/RE文件的第221行)。

(?后视镜必须有固定的字符长度.但是,不同的字符长度只允许在顶级的替代方案。例如。(?<=a|bc)是可以的。(?<=aaa(?:B\cd))是不允许的。 在消极展望中,不允许捕获组,但允许使用害羞组(?:)。

所以看来我的表情应该管用。

在测试了一些东西之后,我发现这是可行的:

代码语言:javascript
复制
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示例,也会得到一个错误:

代码语言:javascript
复制
$ jq -n '("test", "TEst", "teST", "TEST") | test( "(?i)te(?-i)st" )'
jq: error (at <unknown>): Regex failure: invalid group name <>

有谁知道会有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 23:02:14

如果您当前的库版本仅限于固定宽度的查找模式,则无法对其进行太多处理。

在您的例子中,由于您使用的是负查找,所以您可以不进行交替,只需将查找后分割成两部分:

代码语言:javascript
复制
(?<!foo )(?<!bars )baz(?! foo| bars)
^^^^^^^^^^^^^^^^^^^

然后,您不需要关心每个查找后面需要检查多少个字符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64146690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档