gpt4 book ai didi

regex - vim 正则表达式匹配方括号不起作用

转载 作者:行者123 更新时间:2023-12-03 18:38:53 25 4
gpt4 key购买 nike

使用vim,我试图转换以下两行

  output reg [1:0] abcd,
output reg efgh,

进入
abcd
efgh

我正在使用正则表达式,
:%s/\voutput|reg|\s*|\[.*\]|,//g

但是,我得到的输出是,
[1:0]abcd,
efgh,

感谢任何帮助!谢谢。

最佳答案

:help pattern 给出了原因(尽管从先前接触到的不同可能性中猜测原因很有帮助:-)

1. A pattern is one or more branches, separated by "\|". It matches anything that matches one of the branches. Example: "foo\|beep" matches "foo" and matches "beep".If more than one branch matches, the first one is used.



Vim 的正则表达式匹配器是一个第一匹配引擎。 POSIX 要求最左最长。纯粹主义者可能会争辩说,其他任何东西都不是正则表达式匹配器,而只是“模式匹配器”,这可能与 vim 称它们为“模式”有关…… sedperl 是最左边的最长:
$ sed -r 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh
$ perl -ple 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh

但是对于第一场比赛引擎,你必须做一些不同的事情。重新排序您的替代品,它有效:
:%s/\voutput|reg|\[.*\]|,|\s*//g

\s* 替换 \s+ 使其对顺序不敏感:
:%s/\voutput|reg|\s+|\[.*\]|,//g

Vim 的 g 标志似乎只替换第一个匹配分支的每次出现,然后重试,直到没有任何变化。

只是为了完整和困惑,
:%s/\v(reg|output|\s*|\[.*\]|,)*//
abcd,
efgh,


:%s/\v(reg|output|\s*|\[.*\]|,)*//g
abcd
efgh

鉴于上面推导出的规则,这在短时间内对我来说实际上是有意义的。

(编辑: gawk s gensubnvi s extended 引擎显然也是最左边最长的)

关于regex - vim 正则表达式匹配方括号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16915668/

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