写在开篇
不知道你们有没有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制,现在假设我们不知道正则表达式,作为程序员,该如何去实现这样一个密码验证呢?关于正则表达式一直都是个让很多我们都觉得很郁闷的一个东西,觉得创造正则表达式的那个家伙简直就是个奇葩,
了解什么是正则表达式?
正则表达式是?组由字?和符号组成的特殊?本,它可以?来从?本中找出满?你想要的格式的句?
正则表达式可以从?个基础字符串中根据?定的匹配模式替换?本中的字符串、提取字符串等。
正则表达式的分类
- 在 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 正则表达式 |
egrep |
支持 EREs、PREs 正则表达式 |
sed |
支持 BREs、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://mp.weixin.qq.com/s/pGOz_f9_RCTrUYTVejUyJQ
本文所有内容来自互联网,如有侵权/不实内容请联系我们删除,联系邮箱postusb@foxmail.com
发布者:缘分,转转请注明出处:https://www.bjxdyg.com/life/109714.html