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

Posted

技术标签:

【中文标题】如何在 vim 命令中使用正则表达式格式化电话号码列表?【英文标题】:How do I format a list of phone numbers using regular expression in vim commands? 【发布时间】:2017-07-12 02:55:53 【问题描述】:

鉴于以下电话号码列表

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 

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

【问题讨论】:

【参考方案1】:

试试这个:

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

【讨论】:

【参考方案2】:

先用count多次匹配一个模式,重复模式是个坏习惯:

\d\3 "instead of \d\d\d

你还必须匹配空格等:

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

或者更好的是,使用\v 转义整个正则表达式:

:%s/\v.*(\d3).*(\d3).*(\d4).*/\1 \2 \3/g

这大大提高了可读性

【讨论】:

我最初尝试过,但没有成功。忘了我也必须逃离!该死的正则表达式方言。 嗯,为什么投反对票?是的,这有点麻烦,但是您可以使用 \v 技巧来避免逃脱,请参阅我的更新答案@ffledgling 我不是投反对票的人,如果我的评论被视为批评,我很抱歉,我的意思是我应该做的事情,但没有。为我不知道的\v 技巧点赞。 @ffledgling 对不起,我不是说你投反对票,我没有把它理解为批评。但是感谢您的投票,祝您有美好的一天!

以上是关于如何在 vim 命令中使用正则表达式格式化电话号码列表?的主要内容,如果未能解决你的问题,请参考以下文章

vim正则表达式

使用正则表达式的电话号码格式的knockout绑定处理程序

关于手机号码正则判断,在Vue3中的使用

在没有正则表达式的情况下验证具有不同格式的电话号码

如何在 C# 中读取正则表达式捕获

vi 正则表达式