Shell扩展正则表达式练习1——电话号码过滤
国内电话号码目前一般采用区号+7位或8位阿拉伯数字组成,为了尽可能达到练习的目的,自己添加一些规则:
①3位区号:如北京010,上海021,西安029,这里有个例外就是026并未分配,需要做排除处理。②4位区号必须以0开头。③7位或8位电话号码首位必不能为0,。
电话号码常见书写格式自行定义如下几类,如:
0934—12345678
093412345678
(0934)空格12345678
(0934)—12345678
1. 先对最左边括号做模式匹配,区号有带“()”也有不带“()”的情况,可用“^\(?”,因为“(”为特殊字符,所以需要用“\”进行转义。
2. 匹配区号
[0]([1][0]|[2]([^6])|[1-9]{3})\)?
其间使用或表达和表达式分组以及区间和排除性字符“^6”(排除026)等。最后同样需要“\”对“)”进行转义。“[1][0]|[2]([^6])|[1-9]{3}”匹配北京010和02X以及0XXX(4位区号)的情况。
3. 匹配“——”或空格或无符号使用管道 (—|空格|)
4. 匹配7或8位电话号码,使用间隔。
[1-9][[:digit:]]{6,7}
[1-9]过滤掉首位为0的情况。为啥这里不能用[^0]呢?有没有认真想一想?因为单纯只排除0外,还有很多其他字符,可不能保证一定就是数字了。
加入锚字符,完整模式如下:
‘/^(?0)?(-| |)[1-9][[:digit:]]{6,7}$/’
#/bin/bash
#Program:
# script to filter bad phone numbers
gawk --re-interval '/^\(?[0]([1][0]|[2]([^6])|[1-9]{3})\)?(-| |)[1-9][[:digit:]]{6,7}$/'
```测试结果如下:
```bash
```bash
[root@test script]# cat iphonelist
093487654321
09347654321
0934654321
022-87654321
(012)87654321
(026)87654321
(022)-7654321
(5305)76543210
(0755) 76543210
[root@test script]# cat iphonelist | ./isphone.sh
093487654321
09347654321
022-87654321
(022)-7654321
(0755) 76543210
`