1、正则表达式
其实就是一种规范,也就是模式,约束字符串等符合什么样的格式,比如要求字符串必须a开头,t结尾,符合这样条件的字符串就要用到正则表达式。
2、两套库
GNU/Linux中有有两套库用足正则表达式编程,POSIX库,自带的;PCRE库,Perl,功能比较全,本文采用Perl。
3、初体验
$egrep ""^a.*t$" /usr/share/dict/words 表示从words文件中查找以a开头,t结尾的单词。
$egrep ""^a.*t$" /usr/share/dict/words | wc -c 统计得到单词的数量。
4、字符集和单词
“.”用于匹配除了换行符之外的任意一个字符,.at就能匹配cat、#at、&at……
[a-z]at:限定只能是小写字母
[abc]at:只能是a或者b或者c
[a-zA-Z]at.匹配所有的英文字母,[0-9]匹配0到9的数字。
说明:"[a-z]at":只要含有[a-z]at都匹配,例如cat、a#$bat@!bat$@$等,要想只限制cat这样的,要加单词约束/<[a-z]at/>.
Linux中,“单词”是指两侧由非单词字符分割的字符串。
非单词字符是指除了字母、数字、下划线以外的任何字符。
5、字符类的概念
$egrep "[[:upper:]]t$" words,匹配大写字母开头,小写字母t结尾的字符换。诸如[[:uper:]]又很多,小写字母等等。
6、位置匹配
“^”行首、“$”行尾
例:^a[a-z]t$:以字母a开头。t结尾,中间包含一个小写字母的单词。
7、字符转义
这个和C、C++等语言中的转义字符概念一致,就是比如你想输进去“.”,可是“.”表示除换行符外的任何字符,那么可以使用“.”就表示其本身了。
8、重复
“*”表示任意数量的重复
“+”表示重复至少1次
“?”表示重复0或1次
“{3}”表示重复3次,“{n,m}”表示重复至少n次,至多m次;“{n,}”表示重复至少n次,没上限。
9、子表达式
也称为“分组”,说的更直白一点就是,一坨字符串看成一个整体,用括号括起来(),整体出现。
例:“(my){2}&t”就表示以t结尾,my出现两次的字符串。这时候my是一个整体。mymyt等将被匹配。
10、反义
就是取原来的匹配相反的匹配。整体取反。
[^y]:除了y字符都能匹配。[6aoeiu]:除了aooeiu所有的字符。
注意:^[^y]表示行首不为y,^在表示行首和反义时在位置上的区别。
11、分支
^ht$:行首为h,行尾为t,表示并且。
^h|t$:行首为h,或者行尾为t,表示或。
例子:Jan(uary| |.):匹配January或January或者Jan.
12、逆向引用
子表达式(分组)中捕获的内容可以在正则表达式的其他地方再次使用,用户可用反斜杠“”加自表达式上标号来指代该分组匹配到的内容。
(<.*>).?()*1:其中1前面的(<.*>),表示匹配任意长度档次的第一个表达式
从左到右第一个出现的自表达式为1、第二个为2……
……
当然,正则表达式的匹配是门大学问,通常我们只能写出简单的,具体的应用还要自己写出一些更为复杂的正则表达式,并且正则表达式的编写极为容易出错,主要是考虑不全。
大家也可以参考如下这篇文章,写的很赞,很适合入门,简单应用:正则表达式30分钟入门教程