gpt4 book ai didi

regex - vimscript E888 : (NFA regexp) cannot repeat

转载 作者:行者123 更新时间:2023-12-03 16:54:09 24 4
gpt4 key购买 nike

我正在尝试恢复 cocoa.vim脚本。

Error detected while processing function objc#man#ShowDoc:
line 32:
E888: (NFA regexp) cannot repeat

函数 objc#man#ShowDoc 的第 32 行是:

let attrs = split(matchstr(line, '^ \zs*\S*'), '/')[:2]

首先,我不明白这个错误。重复什么?什么不能重复?在线搜索该错误将我带到了 vim 源代码中定义的位置,但它太迟钝了,我不明白它。

其次,我觉得很奇怪,这个正则表达式曾经可以工作,但现在却不能在较新的 vim 上工作。

我的 vimscript 经验很少,也没有太多 regexp 经验。对于那些这样做的人的指导,我们将非常感激。 Here如果您有兴趣的话,这是整个 src 。

最佳答案

问题是 \zs 是匹配正则表达式原子的开始。重复零次或多次没有任何意义,因为您始终可以从 \zs 所在的位置开始匹配。

vim patch 7.4.421 引入了这个错误当 NFA 引擎尝试生成正则表达式时,阻止 vim 崩溃。最有可能的是,这位明星根本不应该在那里。旧的正则表达式引擎允许它,但我不相信它做了任何有意义的事情。

您应该能够通过删除星号来修复它。

let attrs = split(matchstr(line, '^ \zs\S*'), '/')[:2]

(您也可以尝试将 \%#=1 添加到正则表达式以强制使用旧引擎。您可能需要阅读 :h E888 看看它是否显示任何有用的东西。我现在没有具有此补丁级别的 vim 版本可供测试。)

<小时/>

:h\zs 的帮助复制如下。

                                                        /\zs
\zs Matches at any position, and sets the start of the match there: The
next char is the first char of the whole match. /zero-width
Example:
/^\s*\zsif
matches an "if" at the start of a line, ignoring white space.
Can be used multiple times, the last one encountered in a matching
branch is used. Example:
/\(.\{-}\zsFab\)\{3}
Finds the third occurrence of "Fab".
{not in Vi} {not available when compiled without the +syntax feature}

关于regex - vimscript E888 : (NFA regexp) cannot repeat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com