正则是啥子玩意?
正则表达式,又称规则表达式。(英语: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
两个实际の栗子
过滤身份证号码
[root@cn-sz ~]# grep -E '[0-9]{17}[0-9X]' id.txt
陆慧丽 441900199804426517
陈乐琪 320106200010282102
陈乐琪 320106200511034526
赵蕾 320104198410204525
刘家龙 320107199310281223
杨雯 32011319630405884X
赵子龙 44190019960621165X排除文件中的空行或者含有#号开头的行
[root@cn-sz ~]# grep -Ev '^$|^#' /etc/nginx/conf.d/it_blog.conf
结尾
还有一些不是很常用到的这里就不介绍了,大家可以参考一下菜鸟教程里的介绍,又或者自行百度~
如果还是找不到你想要的答案,也可以在下面留言那~大家一起探讨吧~~~