正则是啥子玩意?

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

中文名正则表达式代码简写regex、regexp或RE
外文名Regular Expression行业归属计算机科学
别名规则表达式作用用来检索、替换那些符合某个模式(规则)的文本

简单点用自己的话来说就是用来匹配一些有规律的东西,如手机号码、身份证号码、日志信息等,使用一些符号表达重复出现的大小写、开头/结尾的含义等,用途极其广泛如linux的三剑客、开发语言(python、Golang....)等

正则那些事

使用正则是需要注意所有的符号都应该是英文符号,注意系统的字符集:en_US.UTF-8(大部分情况90%都没有问题),如果出现问题修改字符集为·C export LANG=C·即可

快速掌握正则:配合grep -o参数学习

正则 和 通配符的区别
正则:用于三剑客,高级语言,进行过滤作用
支持的命令:grep,sed,awk,find,rename,expr
---vs---
通配符(pathname extension 或 glob):匹配文件(文件名) .txt .log {01..10}
支持的命令:Linux下面的大部分命令都支持

规则使用

基础正则: ^ $ . * .* [] [^]

^以...开头的行.任意一个字符\转义字符,\n \t
$以...结尾的行*前一个字符连续(重复)出现0次或0次以上[]一个整体,匹配任意一个字符
^$空行.*所有内容[^]取反,排除

^ 以...开头的行

[root@cn-sz ~]# grep '^My' mingo.txt
My blog is https://if010.com
My QQ is 2324829677
My god , i am not mingo,but genius mingo!

符号^的栗子

$ 以...结尾

[root@cn-sz ~]# grep '448$' mingo.txt 
Not 4900000448

符号$的栗子

^$ 空行

空行是指这一行中没有任何内容,要注意的是空格也是个字符,一般用于排除空行 和 排除#号注释行

[root@cn-sz ~]# grep -nv '^$' mingo.txt   //-v 代表排除; -n 代表显示行号
1:I am genius mingo!
2:I like study linux.
3:I like badminton ball , billiard ball and chinese chess!
4:My blog is https://if010.com
6:Our size is https://blog.if010.com
7:My QQ is 2324829677
8:Not 4900000448
9:My god , i am not mingo,but genius mingo!

符号^$的栗子

. 表示任意一个字符

注意点是不匹配空行,也就是说排除掉空行

[root@cn-sz ~]# grep -n '.' mingo.txt 
1:I am genius mingo!
2:I like study linux.
3:I like badminton ball , billiard ball and chinese chess!
4:My blog is https://if010.com
6:Our size is https://blog.if010.com
7:My QQ is 2324829677
8:Not 4900000448
9:My god , i am not mingo,but genius mingo!

符号.的栗子

\ 转义字符 脱掉马甲打回原形,去除原有特殊含义

#匹配出文件中以点结尾的行
[root@cn-sz ~]# grep -n '\.$' mingo.txt 
2:I like study linux.

符号\的栗子

特殊的转义字符序列
\n 回车换行
\t tab键

* 前一个字符连续出现0次或0次以上

[root@cn-sz ~]# grep '0*' mingo.txt 
I am genius mingo!
I like study linux.
I like badminton ball , billiard ball and chinese chess!
My blog is https://if010.com
Our size is https://blog.if010.com

My QQ is 2324829677
Not 4900000448
My god , i am not mingo,but genius mingo!

符号*的栗子

.* 所有内容,任意内容

[root@cn-sz ~]# grep '0.*' mingo.txt 
My blog is https://if010.com
Our size is https://blog.if010.com
Not 4900000448

符号.*的栗子

[] 匹配中括号里任意一个字符,一次匹配一个字符,里面的内容会被去掉特殊意义

[root@cn-sz ~]# grep '[0-9]' mingo.txt
My blog is https://if010.com
Our size is https://blog.if010.com
My QQ is 2324829677
Not 4900000448

# 也可以写成grep '[aZ0-9]' mingo.txt
# 或者也可以写成  grep -i '[a-z0-9]' mingo.txt   -i表示不区分大小写
# grep '[^a-Z0-9]' mingo.txt   []里最前面加……表示取反
[root@cn-sz ~]# grep '[a-zA-Z0-9]' mingo.txt
I am genius mingo!
I like study linux.
I like badminton ball , billiard ball and chinese chess!
My blog is https://if010.com
Our size is https://blog.if010.com
My QQ is 2324829677
Not 4900000448
My god , i am not mingo,but genius mingo!

符号[]的栗子

扩展正则: + | {} ? ()

注意:有些命令默认是不支持扩展正则如:grep需要加-E参数,sed需要加-r参数

+前一个字符连续出现一次或一次以上
()一个整体,sed反向引用
?连续出现0次或者1次
竖线或者
{}o{n,m}前一个字母o至少连续出现n次,最多连续出现m次

+ 前一个字符连续出现了一次或一次以上

[root@cn-sz ~]# grep -Eo '0+' mingo.txt   #-o 只显示符合的内容
0
0
0
0
00000

符号+的栗子

| 或者,匹配多个字符

[root@cn-sz ~]# grep -E 'mingo|blog' mingo.txt
I am genius mingo!
My blog is https://if010.com
Our size is https://blog.if010.com
My god , i am not mingo,but genius mingo!

符号|的栗子

() 被括起来的内容,表示一个整体 后向引用sed

[root@cn-sz ~]# grep -E 'mi(n|m)go' mingo.txt
I am genius mingo!
My god , i am not mingo,but genius mimgo!

符号()的栗子

{} 连续出现

# o{n,m}    前一个字母o至少连续出现n次,最多连续出现m次   >=n <=m
[root@cn-sz ~]# grep -E '0{1,3}' mingo.txt
My blog is https://if010.com
Our size is https://blog.if010.com
Not 4900000448

# o{n}    前一个字母o连续出现n次   ==n
[root@cn-sz ~]# grep -E '0{3}' mingo.txt
Not 4900000448

# o{n,}    前一个字母o最少连续出现n次 >=n
[root@cn-sz ~]# grep -E '0{3,}' mingo.txt
Not 4900000448

# o{,m}    前一个字母o最多连续出现m次 <=m
[root@cn-sz ~]# grep -E '0{,3}' mingo.txt
I am genius mingo!
I like study linux.
I like badminton ball , billiard ball and chinese chess!
My blog is https://if010.com
Our size is https://blog.if010.com

My QQ is 2324829677
Not 4900000448
My god , i am not mingo,but genius mimgo!

符号{}的栗子

? 连续出现 前一个字符连续出现0次或1次

[root@cn-sz ~]# grep -E '\.(com)?' mingo.txt
I like study linux.
My blog is https://if010.com
Our size is https://blog.if010.com

符号?的栗子

两个实际の栗子

  1. 过滤身份证号码

    [root@cn-sz ~]# grep -E '[0-9]{17}[0-9X]' id.txt
    陆慧丽 441900199804426517
    陈乐琪 320106200010282102
    陈乐琪 320106200511034526
    赵蕾 320104198410204525
    刘家龙 320107199310281223
    杨雯 32011319630405884X
    赵子龙 44190019960621165X

  2. 排除文件中的空行或者含有#号开头的行

    [root@cn-sz ~]# grep -Ev '^$|^#' /etc/nginx/conf.d/it_blog.conf

结尾

还有一些不是很常用到的这里就不介绍了,大家可以参考一下菜鸟教程里的介绍,又或者自行百度~

如果还是找不到你想要的答案,也可以在下面留言那~大家一起探讨吧~~~

最后修改:2022 年 04 月 26 日
-