Regex Vim S&;R从InstallShield文件末尾删除编号
我有一个vim正则表达式的实际应用程序,我想删除文件末尾位置链接中的数字。例如,如果开发人员马虎,只添加文件,不重用文件位置,那么最终会出现如下可怕的结果:Regex Vim S&;R从InstallShield文件末尾删除编号,regex,vim,Regex,Vim,我有一个vim正则表达式的实际应用程序,我想删除文件末尾位置链接中的数字。例如,如果开发人员马虎,只添加文件,不重用文件位置,那么最终会出现如下可怕的结果: PATH_TO_MY_FILES> PATH_TO_MY_FILES1> ... PATH_TO_MY_FILES22> PATH_TO_MY_FILES_ELSEWHERE> PATH_TO_MY_FILES_ELSEWHERE1> ... 所以我要做的就是使用正则表达式S&R
PATH_TO_MY_FILES>
PATH_TO_MY_FILES1>
...
PATH_TO_MY_FILES22>
PATH_TO_MY_FILES_ELSEWHERE>
PATH_TO_MY_FILES_ELSEWHERE1>
...
所以我要做的就是使用正则表达式S&R并用PATH to MY_FILES*替换PATH to MY_FILES*\d+。显然,我做得不太对,所以我希望这里的人不必填鸭式地给出答案,而是用regex的流行语让我走上正轨
以下是我尝试过的:
:%s\(PATH_TO_MY_FILES\w*\)\(\d+\)>:gc
但这不起作用,也就是说,如果我只是对它进行vim搜索,它什么也找不到。但是,如果我使用此选项:
:%s\(PATH_TO_MY_FILES\w*\)\(\d\)>: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时&的行为。谢谢