客组家 > 杂谈 > 正文

​正则是什么意思(正则表达式)

2024-01-28 10:24 来源:网络 点击:

正则是什么意思(正则表达式)

写在开篇

不知道你们有没有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制,现在假设我们不知道正则表达式,作为程序员,该如何去实现这样一个密码验证呢?关于正则表达式一直都是个让很多我们都觉得很郁闷的一个东西,觉得创造正则表达式的那个家伙简直就是个奇葩,

了解什么是正则表达式?

正则表达式是?组由字?和符号组成的特殊?本,它可以?来从?本中找出满?你想要的格式的句?

正则表达式可以从?个基础字符串中根据?定的匹配模式替换?本中的字符串、提取字符串等。

正则表达式的分类

在 Linux 和 OS X 下,常见的正则表达式,至少有以下三种:

基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)

扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

Linux/OS X 下常用命令与正则表达式的关系


命令


正则表达式特定


grep


支持 BREs、EREs、PREs 正则表达式
1. 指令后不跟任何参数, 则表示要使用 “BREs”
2. grep 指令后跟 ”-E” 参数, 则表示要使用 “EREs”;
3. grep 指令后跟 “-P” 参数, 则表示要使用 “PREs”。



egrep



支持 EREs、PREs 正则表达式
1. egrep 指令后不跟任何参数, 则表示要使用 “EREs”;
2. egrep 指令后跟 “-P” 参数, 则表示要使用 “PREs”。


sed


支持 BREs、EREs
1. sed 指令默认是使用 “BREs”;
2. sed 指令后跟 “-r” 参数 , 则表示要使用“EREs”。



awk



支持 EREs,并且默认使用 “EREs”

sed 正则表达式特点

sed 功能与作用



sed 处理的对象:文本文件sed 处理操作:对文本文件的内容进行 — 查找、替换、删除、增加等操作sed 在处理文本文件的时候,也是按行处理的

awk 正则表达式特点



awk 处理的对象:文本文件awk 处理操作:主要是对列进行操作

元字符

正则表达式主要依赖于元字符


正则表达式


描述


示例


\b


单词边界


\bcool\b匹配cool,不匹配coolant



\B



非单词边界



cool\B匹配coolant不匹配cool


\d


单个数字字符


b\db匹配b2b,不匹配bcb



\D



单个非数字字符



b\Db匹配bcb不匹配b2b


\w


单个单词字符(字母,数字与_)


\w匹配1或a,不匹配&



\W



单个非单词字符



\W匹配&,不匹配1或a


\n


换行符


\n匹配一个新行



\s



单个空白字符



x\sx匹配xx,不匹配xx


\S


单个非空白字符


x\S\x匹配xkx,不匹配xx



\r



回车



\r匹配回车


\t


横向制表符


\t匹配一个横向制表符



\v



垂直制表符



\v匹配一个垂直制表符


\f


换页符


\f匹配一个换页符

基本正则表达式


字符


描述


^


^word搜索以word开头的内容



$



word$搜索以word结尾的内容


^$


表示空行,不是空格



.



代表且只能代表任意一个字符(不匹配空行)


\


转义字符,让有特殊含义的字符脱掉马甲,现出原形,如.只表示小数点



*



重复之前的字符或文本0个或多个,之前的文本或字符连续0次或多次


.*


任意多个字符



^.*



以任意多个字符串开头,.*尽可能多,有多少算多少,贪婪性


括号表达式




[abc][0- 9][.,/]



匹配字符集合内的任意一个字符a或b或c:[a-z]匹配所有小写字母;表示一个整 体,内藏无限可能;[abc]找a或b或c可以写成[a-c]


[^abc]


匹配不包含后的任意字符a或b或c,是对[abc]的取反,且与含义不同



a{n,m}



重复前面a字符n到m次(如果用egrep或sed -r可去掉斜线)


a{n,}


重复前面a字符至少n次,如果用egrep或sed -r可去掉斜线



a{n}



重复前面a字符n次,如果用egrep或sed -r可去掉斜线

扩展正则表达式ERE


特殊字符


描述


+


重复前一个字符一次或一次以上,前一个字符连续一个或多个,把连续的文本/ 字符取出





重复前面一个字符0次或1次(.是有且只有1个)


()


分组过滤被括起来的东西表示一个整体(一个字符),后向引用

懒惰匹配和贪婪匹配

贪婪匹配:正则表达式中包含重复的限定符时,通常的行为是匹配尽可能多的字符。

懒惰匹配,有时候需要匹配尽可能少的字符。



如果: A.*B,它将会匹配最长的以A开始,以B结束的字符串。那用它来搜索AABAB的话,它会匹配整个字符串AABAB。我们可能需要匹配的是AB这样的话就需要用到懒惰匹配了。


代码/语法


描述


*?


重复任意次,但尽可能少重复



+?



重复1次或更多次,但尽可能少重复


??


重复0次或1次,但尽可能少重复



{n,m}?



重复n到m次,但尽可能少重复


{n,}?


重复n次以上,但尽可能少重复

正则小结

基础正则:BRE


^


$


.


*


.*


[abc]


[^abc]

扩展正则:ERE


+


?


()


{}


a{n,m}


a{n,}


a{n}



转义字符:将字符的意思改变(不支持正则符号的,转变字符含义为正则,支持正则的转变 为普通字符含义)

补充说明


正则表达式


描述


示例


[:alnum:]


[a-zA-Z0-9]匹配任意一个字母或数字字符


[[:alnum:]]+



[:alpha:]



匹配任意一个字母字符(包括大小写字母)



[[:alpha:]]{4}


[:blank:]


空格与制表符(横向纵向)


[[:blank:]]*



[:digit:]



匹配任意一个数字字符



[[:digit:]]?


[:lower:]


匹配小写字母


[[:lower:]]{5,}



[:upper:]



匹配大写字母



([[:upper:]]+)?


[:punct:]


匹配标点符号


[[:punct:]]



[:space:]



匹配一个包括换行符,回车等在内的所有空白符



[[:space:]]+


[:graph:]


匹配任何一个可以看得见的且可以打印的字符


[[:graph:]]



[:xdigit:]



任何一个十六进制数



[[:xdigit:]]+


[:cntrl:]


任何一个控制字符(ASCII字符集中的前32个字符)


[[:cntrl:]]



[:print:]



任何一个可以打印的字符



[[:print:]]

写在最后

学会正则表达式还是有必要的,配合grep,egrep,sed -r,awk更为强大,至少以后你的同事写出来后,不会在脑子里出现 “这是写的啥玩意儿啊?怎么我看不懂呢” 的想法或者同事不会正则表达式就可以牛逼的说,让我来。

本文来自于(喜欢的盆友可以关注哦):https://c.quk.cc/2/b6/q5freaiai3x