用正则表达式替换Vim

Hen*_*vid 3 regex vim substitution

正则表达式的新手,我需要在某些日期模式匹配以更改格式.

我从去mm/dd/yyyyyy-mm-dd那里有没有2000年以前的条目.

什么我不熟悉的是如何组东西用各自的引用\1,\2等等.

我是否首先想要mm/dd/yy与之相匹配( \d{2} ) ( \/\d{2} ) ( \/\d{2} )或是否如此简单\d\d/\d\d/\d\d

假设我的第一个分组是部分正确的想法,我想做的事情如下:

:%s/old/new/g
:%s/ ( \d{2} ) ( \/\d{2} ) ( \/\d{2} ) / ( 20+\3) - (\3) - (\1) /g
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,替换是yyyy-mm-dd format用连字符,而不是斜线.

das*_*ang 9

我打算评论另一个答案,但它变得复杂了.

注意magic环境.如果你想要未转义的parens进行分组,你需要\v在你的模式中包含某个地方.(见:help magic).

如果在:s命令中使用斜杠以外的其他内容,则可以避免转义斜杠.

你很亲密 :)你不想要所有这些空格,因为它们需要在相同的地方匹配空格.

我的解决方案,我使用的\v所以我不需要逃避parens和感叹号,所以我可以在我的模式中使用斜杠而不会逃避它们:

:%s!\v(\d{2})/(\d{2})/(\d{2})!20\3-\2-\1!g
Run Code Online (Sandbox Code Playgroud)

这将匹配以三个或更多数字开头或结尾的"内部"项目.如果你能给出开始/结束标准,那么这可能会有所帮助.假设简单的"单词边界"条件有效,您可以使用<>:

:%s!\v<(\d{2})/(\d{2})/(\d{2})>!20\3-\2-\1!g
Run Code Online (Sandbox Code Playgroud)

特别批评你(学习!):

:%s/ ( \d{2} ) ( \/\d{2} ) ( \/\d{2} ) / ( 20+\3) - (\3) - (\1) /g
Run Code Online (Sandbox Code Playgroud)
  • 摆脱空间,因为大概你不想要它们!
  • 您的分组需要\( \)\v工作
  • \{2}除非你使用,否则你也需要\v
  • 你把斜杠放在第二组和第三组中,这意味着它们也会出现在替换中
  • 你不希望输出中有括号!
  • 你直接替换文字; 你不希望+输出后的20