微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式的学习

正则表达式是对 字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
正则表达式有POSIX和PCRE两种风格的库,前者是Linux自带的正则表达式库,后者是Perl的正则表达式的库这里选择POSIX风格的正则表达式作为讨论对象
$ egrep " a.*t$" /user/words 列出单词表中a开头t结尾的所有单词

1.字符集和单词
在正则表达式中,句点“.”用于匹配除去换行符之外的任意一个字符,下面该正则表达式可以匹配 cat,tat,bat,这样的字符串
.at
"."能够匹配的字符范围是最大的,上面的表达式还可匹配#at,~at,%at等这样的字符串
如果缩小选择范围是匹配更为精确
[a-z]at
该表达式限定at前的那个字符只能是小写字符,其中[]表示用于指定一个字符集,无论[]中又多少个字符,在实际工作中只能匹配其中一个字符
如[abc]用于匹配a或b或c 而不能匹配ab,abc,bc等 而"-"用来描述一个范围,下面这条表达式匹配所有的英文字
[a-zA-Z]
数字也可以用范围来指定[0-9]
egrep '[a-z]at' /usr/words
该表达式匹配了包含cat bat这些单词,并不是iwomen想要的
为了能够严格匹配一个单词,需要为期加上一堆分隔符"\<"和"\>"
\<[a-z]at\>
该表达式就可以匹配a#$bat.bat!!! bat's等但是不会匹配hebat,tacat等这样的单词
为什么前者也被匹配呢?
这是因为单词定义为 两测由非单词字符分割的字符串,非单词值得是字母、数字、下划线之外的任何字符
2.字符类
除了字符集,该类型正则表达式还提供了预定义字符类来匹配某些特定的字符,
[[:upper:]]t$ words 列出该文件下所有以大写字母开头,以小写字母结尾的行
[[:upper:]]就是一个字符类,表示所有的大写字母,等价于[A-Z],
注:POSIX正则表达式中得字符类
类 匹配字符
[[:alnum:]] 文字、数字字符
[[:alpha:]] 字母字符
[[:lower:]] 小写字符
[[:upper:]] 大写字符
[[:digit:]] 小数
[[:xdigit:]] 十六进制数字
[[:punct]] 标点字符
[[:blank:]] 制表符和空格
[[:space:]] 空格
[[:cntrl:]] 所有控制符
[[:print:]] 所有可以打印的字符
[[:graph:]] 除空格外可以打印的字符
3.位置匹配
“^”和 "$" 分别用于匹配行首和行尾
^a[a-z]t$ 该表达式用于匹配所有以a开头以t结尾a和t之间包含一个小写字母的行
“^”和"$"不必同时使用
^[0-9]该表达式匹配所有以数字开头的行。
4.字符转义"\"
句点表示除换行符之外的任意一个字符,那么如何匹配"."本身呢,这就用到转义字符,“\.”匹配“.”
www\.google\.cn该表达式匹配www.google.cn
5.重复
用户有时希望某个字符不止一次出现,正则表达式中得*表示在它前面的模式应该重复0次或者多次
^a.*t$ 该表达式表示所有以a开头、以t结尾的行
具体讲解下,^a匹配以a开头的行,.匹配一个字符(除换行符)*表示指定之前的那个字符可以重复0次或者多次;t$匹配以t结尾的行
"+"指定一次或者更多次。"?"指定重复0次或者1次
\<hi\>.+\<Jerry\>该表达式表示匹配所有在单词hi后面隔了一个或者几个字符后出现Jerry的行
使用{}可以用来明确指定模式重复的次数。{3}表示重复3次,而{3,}表示重复3次或者更多次{3,12}表示重复的次数不少于5次,不多于12次
\<[1-9][0-9]{7,}\>该表达式匹配所有不少于8位的数
注:用于重复模式的元字符
元字符 描述
* 重复0次或者更多次
+ 重复一次或者更多次
? 重复0次或者更多次
{n} 重复n次
{n,} 重复n次或者更多次
ara" style="color:rgb(51,m} 重复不少于n次,不多于m次
6.子表达式
(or){2,}该表达式匹配所有or重复2次或者更多次的行。
但是如果去掉or两边的()则,其匹配的是以o开头r重复2次或者多次的行
7.反义
[^y]该表达式匹配除了字母y的任何字符
[^abdilh]该表达式则匹配除了a,b,d,i,l,h的所有字符
“^”在表示行首和反义时,在位置上得区别。
^[^y]匹配不以y开头的行
8.分支
|表示或
^h|t$匹配以字母h开头或者以t结尾的行
Jan(uary| |\.)|Feb(uary| |\.) |Mar(ch| |\.) |Apr(il| |\.) |May( |\.)| Jun(e| |\.) |Jul(y| |\.)|Aug(ust | |\.) |Sep(tember| |\.) |Oct (ober| |\.) |Nov(ember| |\.) |Dec(ember| |\.)该表达式用于匹配1-12月份的英文写法,包括缩写和完整的写法
以一月份表达式为例
Jan(uary| |\.)表示匹配January或者Jan或者Jan.
9.逆向引用
(\<.*\>).?( )*\1
该表达式匹配所有在某个单词出现后,紧跟着0个或者一个标点符号,以及任意个空格之后再次出现这个单词的行,例如cart cart、logn logn ha!ha!
解释(\<.*\>)匹配任意长度的单词 第一个子表达式
.? 匹配0个或者1个标点符号 ,由于句点前匹配的是单词,因此句点在这里只能匹配标点
()* 匹配0个或者多个空格,第二个子表达式
\1指代第一个字表达式匹配到得模式,如果第一个字表达式匹配的表达式匹配的单词为cart 那么这里也自动称为cart
当然用户也可以使用\2 \4等来正定编号为2.4的子表达hi匹配到得模式,子表达式的编号模式为从1开始,一次递增。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐