vim 找到所有 _ 除了 \sm_<some varaible name>

vim find all _ except \sm_<some varaible name>

我可以在 vim 中使用什么正则表达式来查找除以下使用的下划线之外的所有下划线:

m_<some variable name>

假设 <some variable name> 只能由字母数字字符组成(而不是 _),我们可以做一个 negative lookbehind assertion (:help /\@<!) for \<m(即关键字不得在 _ 之前以 m 开头)

/\%(\<m\)\@<!_/

如果 <some variable name> 本身也可以包含下划线,事情就会变得更复杂。然后我们必须排除在 \<m\<m_\w*\<m_\w*_\w* 的相同位置 (:help /\@!) matches before the underscore (:help /\@<=) 等等,以 \w*\>:[=32= 结尾]

/\%(\%(\<m\%(_\w*\)*\)\@<=_\w*\>\)\@!_/

这也将排除 m_ 本身。为了解决这个问题,我们需要(通过两个分支)区分 \<m_\w* 后面的排除下划线匹配和直接在 \<m 之后的匹配,然后必须有 \w\+ 才能排除它:

/\%(\%(\<m\%(_\w*\)\+\)\@<=_\w*\>\|\%(\<m\)\@<=_\w\+\>\)\@!_/