1. 程式人生 > >【LeetCode 簡單題】47-有效電話號碼個數

【LeetCode 簡單題】47-有效電話號碼個數

宣告:

今天是第47道題。給定一個包含電話號碼列表(一行一個電話號碼)的文字檔案 file.txt,寫一個 bash 指令碼輸出所有有效的電話號碼。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個包含電話號碼列表(一行一個電話號碼)的文字檔案 file.txt,寫一個 bash 指令碼輸出所有有效的電話號碼。

你可以假設一個有效的電話號碼必須滿足以下兩種格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一個數字)你也可以假設每行前後沒有多餘的空格字元。

示例:

假設 file.txt 內容如下:

987-123-4567
123 456 7890
(123) 456-7890

你的指令碼應當輸出下列有效的電話號碼:

987-123-4567
(123) 456-7890

 解法1。用grep命令,自帶正則表示式來找到符合pattern的號碼。耗時16 ms, 在Valid Phone Numbers的Bash提交中擊敗了72.12% 的使用者,程式碼如下。

  • grep 命令被用來檢索一臺伺服器或工作站上任何位置的文字資訊

  • -P:表示列印操作(?存疑)

  • ^:開始標記

  • $:結束標記

  • \d:表示數字

  • {N}:

  • 匹配前一個字元N次

     

grep -P '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt

 解法2。用awk命令,正則表示式和上面的差不多,但顯然效率高很多。耗時12 ms, 在Valid Phone Numbers的Bash提交中擊敗了95.73% 的使用者,程式碼如下。

  • awk:一個強大的文字分析工具,在對文字檔案的處理以及生成報表,awk是無可替代的。awk認為文字檔案都是結構化的,它將每一個輸入行定義為一個記錄,行中的每個字串定義為一個域(段),域和域之間使用分割符分割
  • '/……/':表示中間的是要匹配的正則表示式,省略號……表示上式中的正則表示式
  • ^:匹配一行的開頭
  • $:在正則表示式中匹配行尾
  • [0-9]:表示匹配0-9的數字
  • {3}:表示[0-9]內的數字出現3次
  • |:運算子或
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt

解法3。使用sed命令,耗時12 ms, 在Valid Phone Numbers的Bash提交中擊敗了95.73% 的使用者 ,程式碼如下。

  • sed:一款流編輯工具,用來對文字進行過濾與替換工作,  sed通過輸入讀取檔案內容,但一次僅讀取一行內容進行某些指令處理後輸出,sed更適合於處理大資料檔案。
  • -n:表示關閉預設輸出,預設將自動列印所有行,這樣就不會打印出不符合要求的數字串了
  • -r:表示支援擴充套件正則+ ? () {} |。後面的正則表示式和上面都相同,就是後面多了一個p
  • p:在用sed時,p和-n合用,表示列印某一行,這樣才能把符合要求的行打印出來:
  • [0-9]:表示匹配0-9的數字,也可以替換成:\d
sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt

結尾

解法1:https://blog.csdn.net/sinat_20177327/article/details/81590509

解法2:http://www.cnblogs.com/grandyang/p/5389375.html

解法3:http://www.cnblogs.com/grandyang/p/5389375.html