Vim积极向前看正则表达式

Hen*_*rik 45 regex vim

我仍然不习惯vim正则表达式语法.我有这个代码:

rename_column :keywords, :textline_two_id_4, :textline_two_id_4
Run Code Online (Sandbox Code Playgroud)

我希望在VIM正则表达式语法中将最后一个id与正面预测相匹配.

你会怎么做?

\id@=_\d$
Run Code Online (Sandbox Code Playgroud)

这不起作用.

这个perl语法有效:

id(?=_\d$)
Run Code Online (Sandbox Code Playgroud)

编辑 - 答案:

/id\(_\d$\)\@=
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下语法吗?

Ken*_*ent 65

如果你检查vim帮助,没有太多要解释:( :h \@=)

\@=     Matches the preceding atom with zero width. {not in Vi}
        Like "(?=pattern)" in Perl.
        Example             matches
        foo\(bar\)\@=       "foo" in "foobar"
        foo\(bar\)\@=foo    nothing
Run Code Online (Sandbox Code Playgroud)

这应该匹配最后一个id:

/id\(_\d$\)\@=
Run Code Online (Sandbox Code Playgroud)

用"非常神奇"的方法保存一些反斜杠:

/\vid(_\d$)@=
Run Code Online (Sandbox Code Playgroud)

实际上,使用vim看起来更简单\zs \ze:

id\ze_\d$
Run Code Online (Sandbox Code Playgroud)

  • @Hendrik如果前瞻之前的东西是一组原子,那么括号是必要的.在你的情况下,你有三个原子`_`,`\ d`和`$`.因此,如果没有括号,前瞻只会查找一个不太有用的`$`.括号被视为一个原子,因此你可以预见`_\d $` (2认同)
  • @Maslow你在错误的地方寻找它...只需打开你的vim,和`:h\zs` (2认同)
  • <rant> 正则表达式语法已经很糟糕了,但是带有所有必要的转义和晦涩的非标准构造的 vim 正则表达式语法设法使事情变得更糟 10 倍</rant> (2认同)