gpt4 book ai didi

regex - 为什么在 Vim 中\%(\) 比\(\) 快?

转载 作者:行者123 更新时间:2023-12-04 16:41:54 25 4
gpt4 key购买 nike

我对文档感到困惑:

\%(\) A pattern enclosed by escaped parentheses. */\%(\)* */\%(* *E53* Just like \(\), but without counting it as a sub-expression. This allows using more groups and it's a little bit faster.



有人可以解释差异的原因吗?是因为回溯还是其他原因?

最佳答案

“稍微快一点”的评论是准确的,因为需要做的簿记要少一点,但重点是“一点点”而不是“更快”。基本上,正常情况下,\(pattern\) 匹配的 Material 必须保留以便您可以使用 \3 (对于适当的数字)在替换中引用它。 %符号表示 vim不必跟踪比赛 - 所以它做的工作少了一点。

@SimpleQuestions 问:

What do you mean by "keep track of the match"? How does it affect speed?



您可以使用转义括号来“捕获”匹配模式的部分。例如,假设我们正在使用简单的 C 函数声明——没有指向函数的指针或其他括号源——那么我们可能有一个替代命令,如下所示:
s@\<\([a-zA-Z_][a-zA-Z_0-9]*\)(\([^)]*\))@xyz_\1(int nargs) /* \2 */@

给定一个输入行,例如:
int simple_function(int a, char *b, double c)

输出将是:
int xyz_simple_function(int nargs) /* int a, char *b, double c */

(您为什么要这样做?我想我需要包装 C 函数 simple_function 以便可以从使用不同接口(interface)约定的编译为 C 的语言调用它 - 它基于 Informix 4GL,准确地说。我用它来举个例子——不是因为你真的需要知道为什么它是一个很好的改变。)

现在,在示例中, \1\2在替换文本中指的是正则表达式的捕获部分 - 函数名称(以字母字符开头的字母数字序列 - 将下划线计数为“字母”)和函数参数列表(括号之间的所有内容,但不包括括弧)。

如果我使用 \%(....\)函数标识符周围的符号,然后是 \1将引用参数列表,不会有 \2 .因为 vim不必跟踪正则表达式的两个捕获部分之一,与必须跟踪两个捕获部分相比,它要做的簿记工作要少得多。但是,正如我所说,差异很小。你可能永远无法在实践中测量它。这就是手册说“它允许更多组”的原因;如果您需要对正则表达式的某些部分进行分组但不需要再次引用它们,那么您可以使用更长的正则表达式。但是,当您记住(捕获)正则表达式的 9 个以上部分时,您的大脑通常会在旋转,并且您的手指无论如何都会出错 - 因此通常不值得付出努力。但我认为,这就是使用 \%(...\) 的论点。符号。它匹配 Perl (PCRE) 符号 ' (?:...) ' 用于非捕获正则表达式。

关于regex - 为什么在 Vim 中\%(\) 比\(\) 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/740870/

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