的确是很强大的东西,之前也没有系统的学习过,在学习shell script前是必经之路,那么就系统的搞一搞吧
本节,所有的正则表达式的演示都是以grep为主
而正则表达式在大多数语言中,都有者不同的实现,我们可以进行微调来适应语言的需要
基础的正则表达式
-
” . “ 符号
” . “ 表示匹配换行符外的任意一个字符,举个例子, ‘ r . t ‘ 可以匹配,rot,rut,ret等
-
” * “ 符号
” * “ 符号用于匹配前一个字符 0 ~ 任意 次. 比如 “r*t” 可以匹配,rt,rtt,rttt…
而” * “ 与 “ . “ 是经常在一起套用的, 比如
” r . * t “ 表示匹配 “ r + 任意多个除换行符外的任意字符 + t “ 的文本内容
而 “ r * . t “ 表示匹配 “ 任意多个r + 任意除换行符外的字符 + t “ 的文本内容
-
” \ { \ } “符号
虽然 “ * “ 很方便,但是并不能控制匹配的次数,也不是很好用,所以,使用 “ \ { \ } “ 控制匹配次数
常见用法有以下三种:
-
\ { n \ } 表示匹配之前的字符n次
-
\ { n ,\ } 表示匹配之前的字符至少n次,包含n次
-
\ { n , m \ } 表示匹配之前的字符n~m次
-
-
” ^ “ 符号
这个符号,很好理解,就是用来匹配开头的,
如 ‘^root’ 表示匹配以root开头的行
-
” $ “ 符号
既然有匹配开头的元字符,那么一定有用来匹配行尾的字符,那便是 “ $ “
如: ‘^$’便可以匹配空行
-
”[ ]” 符号
一对方括号,用于匹配出现在方括号中的任一字符 (并非任意字符)
同时,联动 “ ^ “ 在[ ] 中,尖角号表示取反,比如 [^ABCD] 表示不匹配ABCD任一字符
通过以上这些元字符,我们现在可以开始匹配电话号码了
‘^1[38][0-9]{9}‘.即可进行匹配,(但是,一定是从行首开始的,如非行首,可以去掉尖角号)
-
” \ “ 符号
这个符号,其实可以不用多介绍了,就是转义字符.
在将元字符作为一般的文本字符使用时,必须使用转义字符,否则是会造成歧义的.
-
” \ < \ > “ 符号
emmmmmmmmmmm,
有的时候,我们固定要匹配某一个单词,比如要hello,而不要helloworld ,就要使用单词界定符
他会固定匹配指定的单词,不会造成误匹配
以上是8种常用的元字符,下面是一些一般用的元字符,都可以使用上面的常用元字符实现
-
” \ d “ 字符
是进行数字匹配的元字符 即: [0-9]
但是,是Perl兼容模式,所以在grep中使用时,必须加上 “ - P “ 才能成功匹配
-
” \ b “ 字符
匹配单词的边界 boderland 即 “\ < \ > “
-
” \ B, \ W,” 这些,我都觉得有点废…
-
”\ n , \ r , \ t , \ f , \ s , \S “ 便是匹配各种各样的 转义字符
扩展的正则表达式
上面属于基础的元字符,以足够强大了,但是,还是不能满足某些需求,所以才有了扩展的正则表达式
-
” ? “ 匹配前一个字符 0 ~ 1 次
-
” + “ 匹配前一个字符1次以上
-
” ” 或的关系,表示不同分支,用于多种不同情况的并列 - ” ( )” 表示罗列多种可以进行替换的情况
**使用 “ ( ) “ + “ | ” 可以替换 “ [ ] “ ,实现同等效果** |
通配符
通配符并不是正则表达式的内容,通配符是用来匹配文件名的,正则表达式是用来匹配文本内容的
-
” * “ 表示任意个任意字符
-
” ? “ 表示任一个,任意字符
-
“{ }"表示匹配花括号内,所有以逗号隔开的字符
- "^与 ! “ 一般与[ ] 同时使用,表示取反
正则表达式的模式
主要进行贪婪模式和非贪婪模式的解析
说到贪婪模式,就不得不提到三种量词,贪婪量词,逐步量词,独吐量词
1.贪婪量词~~
即为** “ . * “ ** ,表示匹配任意长度的任意字符,(换行符除外)
贪婪量词的工作原理: 遇到贪婪量词,先将剩余的串吃干净,然后往出吐,遇到规则表达式即结束
即,贪婪量词,可以匹配到最长的符合要求的字串
看图
2.逐步量词
用起来很简单,即在贪婪量词后加上 “ ? “ 即可,表示逐步进行匹配.或者说,懒惰模式,尽可能少的匹配
遇到逐步量词后,不会立即吞掉所有字符,而是会,一边吞入字符,一边进行匹配,一旦符合规则表达式,便停止
看图
好吧,上面的东西基本废了,都是Java中规则表达式的内容,
所以,各种语言的实现方式都是略有不同的,需要根据具体情况进行界定
正则表达式的练习
使用grep进行练习
Sed与Awk
这是两个很好用的命令行处理文本的工具,因为使用上按照 – help提示很方便
所以,不再赘述
December 4, 2017 9:07 PM