写在开篇
不晓得你们有没有过这样的经验:咱们去某些网站注册帐号,当你在设置明码的时候,网站会提醒你明码的长度范畴,以及对应的规定限度, 当初假如咱们不晓得正则表达式,作为程序员,该如何去实现这样一个明码验证呢?
对于正则表达式始终都是个让很多咱们都感觉很郁闷的一个货色,感觉发明正则表达式的那个家伙几乎就是个奇葩,
什么是正则表达式?
- 正则表达式就是为了解决大量的文本 | 字符串而定义的一套规定和办法
- 通过定义的这些特殊符号的辅助,系统管理员就能够疾速过滤,替换或输入须要的字符 串。Linux 正则表达式个别以行为单位解决。
- 正则表达式是一种形容一组字符串的模式,相似数字表达式,通过各种操作符组成更小 的表达式
-
为什么应用正则表达式呢?
linux 运维工作,大量过滤日志工作。简略,高效。正则表达式高级工具;三剑客都反对(grep,sed,awk)
-
注意事项
- 正则表达式利用十分宽泛,存在于各种语言中,php perl grep sed awk 反对。ls * 通配符
- 但当初学的是 Linux 中的正则表达式,最常利用正则表达式的命令是 grep(egrep),sed,awk。
-
正则表达式和通配符有本质区别:
正则表达式用来找:【文件】内容,文本,字符串。个别只有三剑客反对,通配符用来找:文件名,一般命令都反对
正则表达式应用注意事项
- 1、linux 正则表达式以行为单位解决字符串
- 2、便于区别过滤出来的字符串,肯定配合 grep/egrep 命令学习。
正则表达式的分类
-
POSIX 标准将正则表达式的分为了两种
- 根本正则表达式(BRE,basic regular expression)
- 高级性能:扩大正则表达式(ERE,extended regular expression)
-
BRE 和 ERE 的区别仅仅是元字符的不同:
- BRE(根底正则表达式)只抵赖的元字符有 ^$.[]* 其余字符识别为一般字符:()
- ERE (扩大正则表达式)则增加了(){}?+| 等
- 只有在用反斜杠“\”进行本义的状况下,字符(){}才会在 BRE 被当作元字符解决,而 ERE 中,任何元符号后面加上反斜杠反而会使其被当作一般字符来解决。
怎么玩辨别通配符和正则表达式
- 不须要思考的判断办法:在三剑客 awk,sed,grep,egrep 都是正则,其余都是通配符
- 区别通配符和正则表达式最简略的办法:
- (1)文件目录名 ===> 通配符
- (2)文件内容(字符串,文本【文件】内容)===> 正则表达式
- 通配符和正则表达式都有“*”,“?”,“[]”,然而通配符的这些符号都能本身代表任意 字符,而正则表达式的这些符号只能代表这些符号后面的字符
根本正则表达式
字符 | 形容 |
---|---|
^ | ^word 搜寻以 word 结尾的内容 |
$ | word$ 搜寻以 word 结尾的内容 |
^$ | 示意空行,不是空格 |
. | 代表且只能代表任意一个字符(不匹配空行) |
\ | 转义字符,让有非凡含意的字符脱掉马甲,现出原形,如. 只示意小数点 |
* | 反复之前的字符或文本 0 个或多个,之前的文本或字符间断 0 次或屡次 |
.* | 任意多个字符 |
^.* | 以任意多个字符串结尾,.* 尽可能多,有多少算多少,贪心性 |
括号表达式 | |
abc[.,/] | 匹配字符汇合内的任意一个字符 a 或 b 或 c:[a-z]匹配所有小写字母;示意一个整 体,内藏有限可能;[abc]找 a 或 b 或 c 能够写成[a-c] |
1 | 匹配不蕴含 ^ 后的任意字符 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 个) |
() | 分组过滤被括起来的货色示意一个整体(一个字符),后向援用 |
正则小结
- 根底正则:BRE
^ | $ | . | * | .* | [abc] | 1 |
---|
- 扩大正则:ERE
+ | ? | () | {} | a{n,m} | a{n,} | a{n} |
---|
转义字符 \: 将字符的意思扭转(不反对正则符号的,转变字符含意为正则,反对正则的转变 为一般字符含意)
- 根本正则和扩大正则区别
根底正则 BRE | 扩大正则 ERE |
---|---|
? | ? |
+ | + |
{} | {} |
(\) | () |
- 所谓根底正则实际上就是得须要转义字符配合表白的正则,而扩大正则就是让命令扩大 它的权限让他间接就意识正则表白符号(egrep,sed -r,awk 间接反对)
-
留神
- grep 默认不反对正则,因而正则表达式的符号对于 grep 来说就等同于一般字符含 义,因而,想让 grep 间接解决正则符号必须通过转义字符 {} 来解决。
- grep -E 强制让 grep 间接意识正则符号,不须要再进行本义
- egrep 等效 grep -E 天生就能意识正则符号
- 咱们平时备份能够通过 cp 文件名 {,.bak} 的模式进行,防止再打一次文件名 sed -r:让 sed 反对正则
补充阐明
正则表达式 | 形容 | 示例 |
---|---|---|
[: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:]] |
### 元字符
正则表达式 | 形容 | 示例 |
---|---|---|
\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 匹配一个换页符 |
写在最初
学会正则表达式还是有必要的,配合 grep,egrep,sed -r,awk 更为弱小,至多当前你的共事写进去后,不会在脑子里呈现 “ 这是写的啥玩意儿啊?怎么我看不懂呢 ” 的想法或者共事不会正则表达式就能够牛逼的说,让我来。
本篇转载于:https://mp.weixin.qq.com/s/pG…
- abc ↩