正则表达式
一、正则表达式的定义
正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。
1.正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。 2.正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。 3.正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,如前面提到的 Perl、Linux 系统中常见的文本处理器(grep、egrep、sed、awk)。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
二、正则表达式用途
1.快速提取 正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便 2.邮件服务器(用途) 在 Internet 中,垃圾/广告邮件经常会造成网络塞车,如果在服务器端就将这些问题邮件提前剔除的话,客户端就会减少很多不必要的带宽消耗。而目前常用的邮件服务器 postfix 以及支持邮件服务器的相关分析软件都支持正则表达式的比对功能。将来信的标题和内容与特殊字符串进行对比,发现问题邮件就过滤掉。除邮件服务器之外,很多服务器软件都支持正则表达式。
虽然这些软件都支持正则表达式,不过字符串的对比规则还需要系统管理员来添加,所以作为系统管理员,正则表达式是必须掌握的技能之一。
三、基础正则表达式
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用的正则表达式的最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。
四、基本正则表达式语法
正则表达式主要用于字符串的模式分割、匹配、查找及替换操作,下面来关注一下正则表达式基本的元字符和它的作用。
正则表达式的分类
1、基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 2、扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs) 3、Perl的正则表达式(Perl Regular Expression 又叫Perl RegEx 简称PREs
基础正则表达式常见元字符
* | 前一个字符匹配0次或者任意多次 | "a*" 匹配所有内容,包括空白行 "aa*" 匹配至少包含一个a的行 "aaa*" 匹配最后包含两个连续a的字符串 "aaaaa*"匹配最少包含4个连续a的字符串 |
. | 匹配除了换行符外的任意一个字符 | "s..d" 匹配在s和d这两个字母之间一定有两个字符的单词 "s.*d" 匹配在s和d字母之间有任意字符 ".*" 匹配所有内容 |
^ | 匹配行首 | "^hello" 匹配以hello开头的行 "^M" 匹配以大写“M”开头的行 |
$ | 匹配行尾 | "hello$" 匹配以hello结尾的行 "n$" 匹配以小写“n”结尾的行 "^$" 匹配空白行 |
[ ] | 匹配中括号中指定的任意一个字符,只匹配一 个字符 | "[aeiou]" 匹配任意一个元音字母, "[0-9]" 匹配任意一位数字, "[a-z][0-9]" 匹配小写字母和一位数字构成的两位字符。 "s[ao]id" 匹配s和i字母中,要么是a,要么是o"[0-9]" 匹配任意一个数字"^[a-z]" 匹配小写字母开头的行 |
[^] | 匹配中括号的字符以外的任意一个字符 | "[^0-9]" 匹配任意一位非数字字符, "[^a-z]" 表示任意一位非小写字母 "^[^a-z]" 匹配不是小写字母开头的行 "^[^a-zA-Z]" 匹配不是字母开头的行 |
转义符。用于将特殊符号的含义取消 | ".$" 匹配使用"."结尾的行 | |
{n} | 表示其前面的字符恰好出现n次 | "[0-9]{4}" 匹配4位数字, "[1][3-8][0-9]{9}" 匹配手机号码 "a{3}" 匹配a字母连续出现3次的字符串 "[0-9]{3}" 匹配包含连续的3个数字的字符串 |
{n,} | 表示其前面的字符出现不小于n次 | "[0-9]{2,}" 表示两位及以上的数字。 "[0-9]{3,}[a-z]" 匹配最少用连续3个数字开头的字符串 |
{n,m} | 表示其前面的字符至少出现n次,最多出现 m次 | "[a-z]{6,8}" 匹配6到8位的小写字母。 "sa{1,3}i" 匹配在字母s和i直接有最少一个a,最多三个a |
扩展正则表达式的常见元字符----egrep、awk命令支持
![72ae9c445bb171aa38e9ca98c6475286.png](https://i-blog.csdnimg.cn/blog_migrate/a126a991253bc022f98dfb8ebdf0b061.jpeg)
1.基础正则表达式示例
1).查找特定字符
命令 | 作用 |
---|---|
-n | 显示行号 |
-i | 不区分大小写 |
-v | 反向查找 |
创建测试文件 [root@localhost ~]# vim test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the li
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
查找the并显示行号
[root@localhost ~]# grep -n 'the' test.txt
![65e096146a3818b24c2970fea9461b2d.png](https://i-blog.csdnimg.cn/blog_migrate/a1731b6ddde47a25ea2573c4d643789e.png)
查找the并不区分大小写
[root@localhost ~]# grep -ni 'the' test.txt
![ef8b71da6bf5a098545059d826157ae7.png](https://i-blog.csdnimg.cn/blog_migrate/0af16545b5f7c328829c724804e03088.jpeg)
反向查找不包含the的行
[root@localhost ~]# grep -nv 'the' test.txt
![d94814f709ea4f27af049b8b798d874f.png](https://i-blog.csdnimg.cn/blog_migrate/d722db1446d9b0b931f109fd578312de.jpeg)
2).利用中括号 “[ ]” 来查找集合字符
[ ]---里面无论有多少字符,都代表一个字符,为'或'的关系
[^]---括号里面的'^'是取反的意思
查找包含shirt和short的行
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
![f1648c2f58414add51c28165a03d1110.png](https://i-blog.csdnimg.cn/blog_migrate/9cfec4c507d2dddf91e41ed69c65b20a.png)
查找重复单个字符 "oo" 的行
[root@localhost ~]# grep -n 'oo' test.txt
![1e02bb8db0a6bc02643de1c05ea8f41b.png](https://i-blog.csdnimg.cn/blog_migrate/b9fe66c6752c86f2761659f904d9754f.jpeg)
查找"oo" 前面不是 "w" 的行
[root@localhost ~]# grep -n '[^w]oo' test.txt
![ee560e04078d5d9824d67538f263b91b.png](https://i-blog.csdnimg.cn/blog_migrate/7bff511074a2f7c4b1d1253ca6a50199.jpeg)
查找 "oo" 前面不是小写字母的行
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
![f5702eb2104d260742b5a163bd43ef18.png](https://i-blog.csdnimg.cn/blog_migrate/022c38eda5a0dd621567b5d65d2798c1.png)
查找 "oo" 前面不是大写字母的行
[root@localhost ~]# grep -n '[^A-Z]oo' test.txt
![95734ec0fd88a87449b97befe08ffa74.png](https://i-blog.csdnimg.cn/blog_migrate/56f324cba0f5c9bd7f14df66c87032b1.jpeg)
查找包含数字的行
[root@localhost ~]# grep -n '[0-9]' test.txt
![d6d73e9655d975886ef116de7a3b5b4d.png](https://i-blog.csdnimg.cn/blog_migrate/bcff2994cb5f0fb34e2d49387d5dbdc8.png)
3).查找行首 “^” 与行尾字符 “$”
- 小数点 "."在正则表达式中为元字符,需要使用转义字符" "将其转化为普通字符
查找以小数点 "." 结尾的行
[root@localhost ~]# grep -n '.$' test.txt
![0ce698976b6b623f1f516b49320280d9.png](https://i-blog.csdnimg.cn/blog_migrate/ad18d4bbef028d22c7fb7cca98bf22d9.jpeg)
查找空行
[root@localhost ~]# grep -n '^$' test.txt
![0b716f902732049598d220b02fc3ea51.png](https://i-blog.csdnimg.cn/blog_migrate/383b497f0656c007d3feb32b9f44f0ae.png)
4).查找任意一个字符用 “.”,重复字符用 “*”
查找以 "w" 开头,"d" 结尾共4个字符的行
[root@localhost ~]# grep -n 'w..d' test.txt
![145c94ecdf89d23e9185ab6dfbc77d0b.png](https://i-blog.csdnimg.cn/blog_migrate/9b849c3828e79f62ce71f2ea23c89b5d.png)
*—表示重复零个或多个前面的单字符
- 例:'oo*' —第一个o必须存在,第二个o可以是零个或多个,所以o,oo,ooo,等都符合规则
查询至少包含两个o以上的字符串
[root@localhost ~]# grep -n 'ooo*' test.txt
![000d66ade8498cf815e4783c3abc76bf.png](https://i-blog.csdnimg.cn/blog_migrate/1463b33d0395a6c73408b5fe39115107.jpeg)
查找以 "w" 开头,中间至少包含一个 "o" 的,"d" 结尾的行
[root@localhost ~]# grep -n 'woo*d' test.txt
![11cb0dcb97555ffc3b15a5153d3d7697.png](https://i-blog.csdnimg.cn/blog_migrate/c9e0246ad829e88ae7c2c5258b41bdfb.png)
查找以 "w" 开头,"d" 结尾,中间字符可有可无的行
[root@localhost ~]# grep -n 'w.*d' test.txt
![28f80840384d77aed5bc4e31238f3885.png](https://i-blog.csdnimg.cn/blog_migrate/569d588d5f898e06018aab49d4d87e9c.jpeg)
查询任意数字的行
[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt
![aaa141420c7930b03fcab1718db700e8.png](https://i-blog.csdnimg.cn/blog_migrate/84a258c9dc4c6be767d018b5352c9cd8.png)
5).查找连续字符范围 {}
使用 "." 和 "*" 可以设置零个或无限个重复的字符
- 如果要限制一个范围则使用 "{}"
查看2个o的字符
[root@localhost ~]# grep -n 'o{2}' test.txt
![4f8cf4a624d3bb84025125d31f615505.png](https://i-blog.csdnimg.cn/blog_migrate/78847cb6521e58a599e5ffc64c5cb9d6.jpeg)
查看以 "w" 开头,"d"结尾,中间为2,5个o的字符串
[root@localhost ~]# grep -n 'wo{2,5}d' test.txt
![e5eb839d2f0b01c56d9e1ea5fbd83566.png](https://i-blog.csdnimg.cn/blog_migrate/a315b9de412e2cf431418d6830ab1421.png)
2.扩展正则表达式示例
[root@localhost ~]# egrep -n 'wo+d' test.txt
执行该命令即可查询到"wood","woood","wooooood"等字符串
![18057e2a3261289a2c680def58bd3519.png](https://i-blog.csdnimg.cn/blog_migrate/361bd016eb8dd88505f5c5e20b103c2e.png)
[root@localhost ~]# egrep -n 'bes?t' test.txt
执行该命令即可查询到"bet""best"这两个字符串
![150c748e0a672e8c06bca049340612a3.png](https://i-blog.csdnimg.cn/blog_migrate/fed8d641d5ff308633e5a67287952751.png)
[root@localhost ~]# egrep -n 'of|is|on' test.txt
执行该命令即可查询到"of",或者"is",或者"on"字符串
![dd05382747d52c755827c2786ccb5dee.png](https://i-blog.csdnimg.cn/blog_migrate/d34619297dc18a74098063967c779061.jpeg)
[root@localhost ~]# egrep -n 't(a|e)st' test.txt
"tast"与"test"因为这两个单词的"t"与"st"是重复的,所以将"a"与"e"列入"()"符号当中,并以"|"分隔,即可查询"tast"
或者"test"字符串
![2be6f5907e29acb4b6cefd05984bd98c.png](https://i-blog.csdnimg.cn/blog_migrate/9cb45f9f800e0d1140c383a3fe8981e6.png)
[root@localhost ~]# egrep -n 'A(xyz)+C' test.txt
该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思
![b1c3d9574d6f912f456bd599f158e752.png](https://i-blog.csdnimg.cn/blog_migrate/ea165633132936eff4fda14313366f57.png)
感谢阅读,限于水平,如果错误,欢迎留言指正