2012-11-02 70 views
3

新的正则表达式,我需要在某些日期模式匹配来改变格式。用正则表达式替换Vim

那里到2000

之前没有条目我会从mm/dd/yyyyyy-mm-dd什么我不熟悉是一群怎样的东西使用的\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 

编辑:对不起,取而代之的是去一个yyyy-mm-dd format连字符,而不是斜线。

回答

9

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

注意magic设置。如果你想要非转义的parens进行分组,你需要在你的模式中包含\v。 (见:help magic)。

如果您在:s命令中使用了斜线以外的内容,则可以避免使用斜线。

你就近了。 :)你不需要所有这些空间,因为他们需要空间在相同的地方匹配。

我的解决办法,在这里我用\v所以我不需要逃避括号和感叹号,所以我可以用我的方式斜线没有逃脱他们:

:%s!\v(\d{2})/(\d{2})/(\d{2})!20\3-\2-\1!g 

这将匹配“内部”项目即使以三位或更多位数开始或结束也是如此。如果你可以给出开始/结束标准,那么这可能会有所帮助。假设简单的“单词边界”的条件下工作,可以使用<>:(!学习)

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

要特别批评你:因为想必你不

:%s/ (\d{2}) (\/\d{2}) (\/\d{2})/(20+\3) - (\3) - (\1) /g 
  • 摆脱空间不要他们!
  • 您的分组需要要么\(\)\v工作
  • 您还需要\{2}除非你使用\v
  • 你把斜线在组二和三,这意味着他们将在更换出现过
  • 你不想在输出中使用括号!
  • 您直接替换文本;你不想在输出20之后输入+
+0

+1为“魔术”的解释。多年来,我一直是一名vi/vim用户,并且习惯于逃避一切。 – Gus

-1

的比赛:(\d{2})\/(\d{2})\/(\d{2})

对于替换:20\3\/\1\/\2

+0

这与匹配二进制文字的字面parens和大括号相匹配。 –

+0

什么? http://rubular.com/r/LLK0Ycxo6D –

+0

Ruby不是Vim。 –

1

试试这个:你有兴趣

:%s/\(\d\{2}\)\/\(\d\{2}\)\/\(\d\{2}\)/20\3-\2-\1/g 

该位是:\(...\) - 捕捉; \d - 一个数字; \{N} - 出现N次;和\/ - 一个文字正斜杠。

这就是捕获两位数字,跳过一个斜线,再捕获两个数字,跳过另一个斜线,再捕获两个数字,然后用“20”+第三个对联代替+“ - ”+第二个对联+“ - ” +第一个对联。这应该将“dd/mm/yy”变成“20yy-mm-dd”。

+0

更改了替换模式以反映对该问题的编辑。 –

1

没关系,试试这个:

:0,$s#\(\d\{1,2\}\)/\(\d\{1,2\}\)/\(\d\{1,2\}\)#20\3-\2-\1#g 

我已经删除了大量的空间,无论是在匹配部分和替换部分,和大多数括号的,因为格式你问了没没有。

注意到有些事情:

  • vi,你可以改变“/”其他任何字符,当你试图匹配在它斜线一个字符串,它可以帮助..我通常使用' #'但它不一定是。
  • 你必须逃避parens和花括号
  • 我使用:0,$而不是%s,但我认为它有相同的含义 - 将下列命令应用于行之间的每一行0和结束。
+0

'0,$'是三个字符,当'%'表示同一个东西!尽管允许一位数, OP没有说明数字是否为零填充。 –