【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

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/83239521
今日推荐