Hen*_*vid 3 regex vim substitution
正则表达式的新手,我需要在某些日期模式匹配以更改格式.
我从去mm/dd/yy到yyyy-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用连字符,而不是斜线.
我打算评论另一个答案,但它变得复杂了.
注意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