2017-02-22 53 views
0

鑑於電話號碼下面的列表如何在vim命令中使用正則表達式來格式化電話號碼列表?

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

寫一個正則表達式(使用上洛基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, 
1

首先利用計多次匹配的模式,這是一個壞習慣中重複模式:

\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 

這大大增加了可讀性

+0

我想這原本並沒有奏效。忘了我也必須逃避'{'和'}'!該死的正則表達方言。 – ffledgling

+0

呵呵爲什麼downvote?是的,這是有點麻煩,但你可以使用\ V技巧不能逃脫,看到我更新的答案@ffledgling –

+0

我不是一個downvoted,我很抱歉,如果我的評論來批評,我實際上意味着這是我應該做的事情,但沒有。爲我不知道的'\ v'技巧進行upvoting。 – ffledgling