跳至主要內容

193. 有效电话号码


193. 有效电话号码

🟢   🔖  Shell  🔗 力扣open in new window LeetCodeopen in new window

题目

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

解题思路

  1. 使用 grep 命令处理文件,-E 选项表示启用扩展正则表达式 (ERE)。

  2. 正则表达式解析
    使用 ^$ 表示整行匹配,构造如下两部分的正则表达式,并用 | 表示“或”关系:

    • ^([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 个数字(最后部分)。
      • $:匹配行尾。
  3. 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