我有一个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_FILES * \ d +。显然我没有做得很对,所以我希望有人在这里不能用勺子来回答这个问题,但是为了让我走上正轨,我会抛出一个正则表达式的流行语。
以下是我的尝试:
:%s\(PATH_TO_MY_FILES\w*\)\(\d+\)>:gc
但是这不起作用,即如果我只是对它进行vim搜索,它就找不到任何东西。但是,如果我使用它:
:%s\(PATH_TO_MY_FILES\w*\)\(\d\)>:gc
它将匹配字符串,但正如预期的那样,分组已关闭。例如,字符串PATH_TO_MY_FILES22将被分组为(PATH_TO_MY_FILES2)(2),大概是因为\ d仅匹配2,而\ w匹配包括前2个。
问题1:为什么\ d +不起作用?
如果我继续使用第二个字符串(这是错误的),Vim似乎找到一个匹配(即使分组错误),但是然后更换错误。
例如,假设我们知道\ d只会匹配字符串中的最后一个数字,我希望PATH_TO_MY_FILES22>
替换为PATH_TO_MY_FILES2>
。但是,它取而代之的是:
PATH_TO_MY_FILES2PATH_TO_MY_FILES22&安培; GTGT
所以基本上,它看起来像找到了PATH_TO_MY_FILES22& gt,但是后来只替换了&第1组,即PATH_TO_MY_FILES2。
我在Regexr.com尝试了另一个正则表达式,看看它如何解释我的分组,看起来是正确的,但也许是对我缺乏正则表达式理解的黑客攻击:
(PATH_TO_ \ d *)(\ d *)&安培; GT
这正确地将我的目标字符串分解为PATH部分和整个数字,所以我很高兴。但是当我在Vim中使用它时,它找到了匹配,但仍然只替换了&。
问题2:为什么Vim只替换&?
答案 0 :(得分:2)
回答1:
你需要逃避+
,否则它将被逐字逐句。例如\d\+
正常工作。
回答2:
替换的替换部分中未转义的&
表示“整个匹配的文本”。如果你想要一个文字&符号,你需要逃脱它。