详解剖析Shell中的正则表达式

概述

  • 正则表达式又称规则表达式(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,且25位,并用$来表示结尾】

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaKe___Easy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值