Regex Vim S&;R从InstallShield文件末尾删除编号

Regex Vim S&;R从InstallShield文件末尾删除编号,regex,vim,Regex,Vim,我有一个vim正则表达式的实际应用程序,我想删除文件末尾位置链接中的数字。例如,如果开发人员马虎,只添加文件,不重用文件位置,那么最终会出现如下可怕的结果: PATH_TO_MY_FILES&gt PATH_TO_MY_FILES1&gt ... PATH_TO_MY_FILES22&gt PATH_TO_MY_FILES_ELSEWHERE&gt PATH_TO_MY_FILES_ELSEWHERE1&gt ... 所以我要做的就是使用正则表达式S&R

我有一个vim正则表达式的实际应用程序,我想删除文件末尾位置链接中的数字。例如,如果开发人员马虎,只添加文件,不重用文件位置,那么最终会出现如下可怕的结果:

PATH_TO_MY_FILES&gt
PATH_TO_MY_FILES1&gt
...
PATH_TO_MY_FILES22&gt
PATH_TO_MY_FILES_ELSEWHERE&gt
PATH_TO_MY_FILES_ELSEWHERE1&gt
...
所以我要做的就是使用正则表达式S&R并用PATH to MY_FILES*替换PATH to MY_FILES*\d+。显然,我做得不太对,所以我希望这里的人不必填鸭式地给出答案,而是用regex的流行语让我走上正轨

以下是我尝试过的:

:%s\(PATH_TO_MY_FILES\w*\)\(\d+\)&gt:gc
但这不起作用,也就是说,如果我只是对它进行vim搜索,它什么也找不到。但是,如果我使用此选项:

:%s\(PATH_TO_MY_FILES\w*\)\(\d\)&gt:gc
它将匹配字符串,但分组已关闭,如预期的那样。例如,字符串PATH_TO_MY_FILES2将被分组为(PATH_TO_MY_FILES2)(2),可能是因为\d只匹配2,而\w匹配包括前2

问题1:为什么\d+不起作用?

如果我继续使用第二个字符串(这是错误的),Vim似乎会找到一个匹配项(即使分组是错误的),但随后会错误地进行替换

例如,假设我们知道\d将只匹配字符串中的最后一个数字,我希望
PATH\u TO\u MY\u FILES2>
将替换为
PATH\u TO\u MY\u FILES2>
。但是,它将替换为以下内容:

路径到我的文件2路径到我的文件22>

因此,基本上,它看起来像是找到路径到我的文件22>,但随后仅将&替换为组1,即路径到我的文件2

我在Regexr.com上尝试了另一个正则表达式,看看它如何解释我的分组,它看起来是正确的,但可能是因为我对正则表达式缺乏理解:

(路径\u到\ud*)(\D*)>

这正确地将我的目标字符串分为路径部分和整数,所以我很高兴。但是当我在Vim中使用它时,它找到了匹配项,但仍然只替换了&


问题2:为什么Vim只替换&?答案1:

您需要转义
+
,否则它将被照字面理解。例如,
\d\+
工作正常

答案2:


替换部分中未替换的
&
表示“整个匹配文本”。如果你想要一个文字符号,你需要转义它。

另请参见
:h\v
,了解如何使Vim的正则表达式引擎更像普通的正则表达式/PCRE.oh man:)谢谢,我现在就试试这个。有趣的是(或不是)怎么失踪\把一切都搞砸了。但我完全不知道在替换字符串中取消scape时&的行为。谢谢