如何在 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 命令中使用正则表达式格式化电话号码列表?的主要内容,如果未能解决你的问题,请参考以下文章