shell编程之正则表达式

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分钟入门教程

posted @ 2016-01-19 10:18  YouxiBug  阅读(300)  评论(0编辑  收藏  举报