如何在vim命令中使用正则表达式格式化电话号码列表?

时间:2017-02-22 07:21:04

标签: regex vim command-prompt backreference loki

给出以下电话号码列表

8144658695
812 673 5748
812 453 6783
812-348-7584
(617) 536 6584
834-674-8595

编写一个正则表达式(在loki上使用vim)重新格式化数字,使它们看起来像这样

814 465 8695
812 673 5748
812 453 6783
812 348 7584
617 536 6584
834 674 8595

我正在使用搜索和替换命令。我的正则表达式使用反向引用:

:%s/\(\d\d\d\)\(\d\d\d\)\(\d\d\d\d\)/\1 \2 \3\g 

仅格式化第一行。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

:%s,.*\(\d\d\d\).*\(\d\d\d\).*\(\d\d\d\d\).*,\1 \2 \3,

答案 1 :(得分:1)

首先使用count来多次匹配一个模式,重复模式是一个不好的习惯:

\d\{3} "instead of \d\d\d

比你还必须匹配空格等:

:%s/.*\(\d\{3}\).*\(\d\{3}\).*\(\d\{4}\).*/\1 \2 \3/g 

甚至更好,用\v逃避整个正则表达式:

:%s/\v.*(\d{3}).*(\d{3}).*(\d{4}).*/\1 \2 \3/g

这极大地提高了可读性