- A+
leetcode:193. 有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件 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
答:
grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
1.思路:
题目的核心是匹配符合规则的字符串,因为规则比较单一,所以使用正则表达式来检索符合要求的字符串即可。
2.规则分析:
(xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
从规则中可以看出,只要符合上述形势的数字组合即可。
分析 (xxx) xxx-xxxx
我们把其中的规律列出来,找出固定的字符位置与可变字符的规律。
最终需要用正则表达式中的普通字符、特殊字符、限定符、定位符来描述对应的规律(如上图所示)
3.使用正则表达式描述规律
个人感觉,正则表达式的重点有三:特殊字符、限定字符、定位符
熟练掌握这三点,大部分的正则表达都不在话下~
- 特殊字符:勿忘加上转义符'\'
- 限定字符:限定字符出现的次数,掌握它也就get了精华,麻麻再也不用担心我读不懂漂亮的表达式了。
- 定位符:稍加理解,就能get到的好技巧
3.1 使用正则表达式描述上面的内容
表达 (xxx) xxx-xxxx
^([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
使用限定符来限定数字出现的次数,优化为如下表达
^([0-9]{3}) [0-9]{3}-[0-9]{4}$
表达 xxx-xxx-xxxx
^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
使用限定符来限定数字出现的次数,优化为如下表达
^[0-9]{3}-[0-9]{3}-[0-9]{4}$
Note: 使用标准的POSIX表达式中未定义\d表示数字,需要使用“扩展正则”的方式才行。例如sed和grep都支持此表达方式。
同时表示xxx-xxx-xxxx和 (xxx) xxx-xxxx
使用特殊字符()和|。用()来标记一个表达式,使用|来指明两项之间的任意选择。
xxx-xxx-xxxx和 (xxx) xxx-xxxx
最终表达式如下:
^([0-9]{3}-|([0-9]{3}) )[0-9]{3}-[0-9]{4}$
4.grep与awk
- grep
grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
- awk/gawk
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
或者
gawk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
5.附加快速查看表
为了方便查看,列出对应的特殊字符表以及表达方式



转载:https://leetcode-cn.com/problems/valid-phone-numbers/solution/zheng-ze-biao-da-shi-zhong-xian-ding-fu-yu-ding-we/
