193. 有效电话号码
193. 有效电话号码
题目
Given a text file file.txt
that contains a list of phone numbers (one per line), write a one-liner bash script to print all valid phone numbers.
You may assume that a valid phone number must appear in one of the following two formats: (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)
You may also assume each line in the text file must not contain leading or trailing white spaces.
Example:
Assume that file.txt
has the following content:
987-123-4567
123 456 7890
(123) 456-7890
Your script should output the following valid phone numbers:
987-123-4567
(123) 456-7890
题目大意
给定一个包含电话号码列表(一行一个电话号码)的文本文件 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
命令处理文件,-E
选项表示启用扩展正则表达式 (ERE)。正则表达式解析
使用^
和$
表示整行匹配,构造如下两部分的正则表达式,并用|
表示“或”关系:^([0-9]{3}-[0-9]{3}-[0-9]{4})$
:^
:匹配行首。[0-9]{3}
:匹配 3 个数字(区号)。-
:匹配连字符。[0-9]{3}
:匹配 3 个数字(中间部分)。-
:匹配连字符。[0-9]{4}
:匹配 4 个数字(最后部分)。$
:匹配行尾。
^(\([0-9]{3}\) [0-9]{3}-[0-9]{4})$
:^
:匹配行首。\(
和\)
:匹配括号,注意需要转义。[0-9]{3}
:匹配括号内的 3 个数字(区号)。:匹配括号后的空格。
[0-9]{3}
:匹配 3 个数字(中间部分)。-
:匹配连字符。[0-9]{4}
:匹配 4 个数字(最后部分)。$
:匹配行尾。
file.txt
:文件名,表示要处理的文本文件。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是文件中的行数。grep
对每一行执行正则匹配操作。 - 空间复杂度:
O(1)
,只需存储当前行的状态,不需要额外空间。
代码
grep -E '^([0-9]{3}-[0-9]{3}-[0-9]{4})$|^(\([0-9]{3}\) [0-9]{3}-[0-9]{4})$' file.txt