详解剖析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

猜你喜欢

转载自blog.csdn.net/TaKe___Easy/article/details/114753552