概述
- 正则表达式又称规则表达式(Regular Expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
- 正则表达式通常用做于判断语句中,用来检查某一串字符是否满足某一格式
- 正则表达式是由普通字符与元字符组成
- 普通字符:包括大小写字母、数字、标点符号及一些其他符号
- 元字符:在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符在目标对象中的出现模式
- 前导字符:位于元字符前面的字符
- . [ ] ^ $四个字符是所有语言都支持的正则表达式,所以这四个是基础的正则表达式。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度,让很多初学者看起来会懵,如果把等价都恢复成原始写法,自己书写正则就超级简单了,就像说话一样去写你的正则了
基础正则表达式常见元字符
- 支持的工具:grep、egrep、sed、awk
元字符 | 说明 |
---|---|
\ | 转义字符,用于取消特殊符号的含义 例如:\!、\n、$等 |
^ | 匹配字符串开始的位置 例如:^a、^the、^#、^[a-z] |
$ | 匹配字符串结束的位置 例如:word$、^$(匹配空行) |
. | 匹配出\n之外的任意一个字符 例如:ea.y、e…y |
* | 匹配前面子表达式0次或者多次 例如:goo*d、go.*d |
[list] | 匹配list列表中的一个字符 例如:ea[sla]d,[abc]、[a-z]、[a-z0-9]、[0-9](匹配任意一位数字) |
[^list] | 匹配任意非list列表中的一个字符 例如:[^0-9]、[^A-Z0-9] 、[^a-z](匹配任意一位非小写字母) |
\{n\} | 匹配前面的子表达式n次 例如:go\{2\}d,’[0-9]\{2\}’(匹配两位数字) |
\{n,\} | 匹配前面的子表达式不少于n次 例如:go\{2,\}d、’[0-9]\{2,\}’(匹配两位及两位以上数字) |
\{n,m\} | 匹配前面的子表达式n到m次 例如:go\{2,3}d、’[0-9]\{2,3\}’ (匹配两位到三位数字) |
注意 | 因为{}有其他功能,所以大多数工具在使用时需要加上转义符来取消特殊含义 当egrep和awk使用{n}、{n,}、{n,m}匹配时“{}”前不用加“\” |
扩展正则表达式元字符
- 支持的工具:egrep、awk
元字符 | 说明 |
---|---|
+ | 匹配前面子表达式1次以上 例如:go+d(至少匹配一个o,如god、good、goood等) |
? | 匹配前面子表达式0次或者1次 例如:go?d (匹配gd或者god) |
() | 将括号中的字符串作为一个整体,可以配合+ 、? 、* 使用 例如:g(oo)+d(匹配oo整体1次以上,如good、gooood等) |
| | 以或的方式匹配字条串 例如:g(oo|la)d(将匹配good或者glad) |
正则表达式语法支持情况
命令或环境 | . | [ ] | ^ | $ | \(\) | \{\} | ? | + | | | () |
---|---|---|---|---|---|---|---|---|---|---|
vi | 支持 | 支持 | 支持 | 支持 | 支持 | |||||
Visual C++ | 支持 | 支持 | 支持 | 支持 | 支持 | |||||
awk | 支持 | 支持 | 支持 | 支持 | awk是支持该语法的,只是要在命令行加入 --posix or --re-interval参数即可,可见man awk中的interval expression | 支持 | 支持 | 支持 | 支持 | |
sed | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | ||||
delphi | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | |
python | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
java | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
javascript | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | |
php | 支持 | 支持 | 支持 | 支持 | 支持 | |||||
perl | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | |
c# | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
匹配手机号
- 完整的匹配出13和15开头且共11位的手机号,非11位的都不讲匹配出
[root@localhost ~]# egrep "^(13|15)[0-9][ ]?[0-9]{4}[ ]?[0-9]{4}$" 8.txt
13133366888
157 1519 2901
[root@localhost ~]# vim 8.txt
1333333333#
155.5533385
18888888888
123456789?1
13133366888
123456789
88888787
157 1519 2901
1311885578
1567890
151234567890
13141516171819
匹配邮箱
- 匹配出满足格式要求的@sohu.com、@qq.com、@163.com、@wo.cn、@sina.com.cn的邮箱
- 邮箱格式:用户名以字母开头,中间可用最多2种符号 - 或 . ,不能使用符号结尾,用户名长度为最少6个字符
[root@localhost ~]# egrep "^[a-zA-Z][a-zA-Z0-9\.\-]{4,}[a-zA-Z0-9]@([a-zA-Z0-9_\-\.]+)\.([A-Za-z]{2,5})$" email.txt
【用户名:因为-和.有连续和任意字符的意义,所以加上转义符\来表示。因为最少6位,所以中间用{4,}代表至少4位以上的字符
子域名:可以包含大写A-Z,小写a-z,数字0-9,符号“-”和“.”且一次以上
.顶级域:因为以.开头所以用转义符\.表示,且包含大写A-Z,小写a-z,且2到5位,并用$来表示结尾】
qwrqwrg@sohu.com
qfgqwg.gqt-gewg@qq.com
WQ.QR1131@sina.com.cn
wer123@sina.com
[root@localhost ~]# vim email.txt
qwrqwrg@sohu.com
qfgqwg.gqt-gewg@qq.com
qe88@163.com
QFQW SFG@wo.cn
WQ.QR1131@sina.com.cn
qwrqwr@sina.123
123wer$sina.com
wer123@sina.com