正则表达式中限定符与定位符的灵活使用

  • A+
所属分类:Algorithm 学习笔记
摘要

leetcode:193. 有效电话号码,正则表达式中限定符与定位符的灵活使用

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/

正则表达式中限定符与定位符的灵活使用
zore

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: