【问题标题】:How do I format a list of phone numbers using regular expression in vim commands?如何在 vim 命令中使用正则表达式格式化电话号码列表?
【发布时间】: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 

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

【问题讨论】:

    标签: regex vim command-prompt backreference loki


    【解决方案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.*(\d{3}).*(\d{3}).*(\d{4}).*/\1 \2 \3/g
      

      这大大提高了可读性

      【讨论】:

      • 我最初尝试过,但没有成功。忘了我也必须逃离{}!该死的正则表达式方言。
      • 嗯,为什么投反对票?是的,这有点麻烦,但是您可以使用 \v 技巧来避免逃脱,请参阅我的更新答案@ffledgling
      • 我不是投反对票的人,如果我的评论被视为批评,我很抱歉,我的意思是我应该做的事情,但没有。为我不知道的\v 技巧点赞。
      • @ffledgling 对不起,我不是说你投反对票,我没有把它理解为批评。但是感谢您的投票,祝您有美好的一天!
      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 2019-05-23
      • 2021-01-21
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2014-02-15
      相关资源
      最近更新 更多