码迷,mamicode.com
首页 > 系统相关 > 详细

Linux-正则表达式

时间:2019-05-27 09:13:48      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:lin   灵活   表示   转义符   转换   重复   一个   passwd   grep   

一、正则表达式:
正则表达式就是能用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串。
所谓元字符,就是用以阐述字符表达式内容、转换和描述各种操作信息的字符。
例如:
1. \<和\>:
这两个符号分别用于界定单词的左边界和右边界。比如说"\<hello"用于匹配以hello开头的单词;"hello\>"则
相反。
就是正则表达式中的两个特殊字符,它代表的意思是一个单词的开始或结束的位置。
如:grep ‘\<bc\>‘ test.log

2. “.” (一个点)符号;
点符号用于匹配除换行符之外的任意一个字符。例如:r.t可以匹配rot、rut,但是不能
匹配root,若使用r..t就可以匹配root、ruut、rt(中间是两个空格)
如:grep ‘c.f‘ test.log

3.“*”符号:
用于匹配前一个字符0次或任意多次,比如ab*,可以匹配a、ab、abb、等。“*”号经常和“.”号加在一起
使用。比如“.*”代表任意长度的不包含换行的字符。
如:grep ‘r*t‘ /etc/passwd
如果把上面的‘r*t‘换成‘r.*t‘,代表查找包含字母r,后面紧跟任意长度的字符,再跟一个字母t的行。

4.“\{n,m\}”符号:
虽然*可以用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用“\{n,m\}”符号则能更加灵活
地控制字符的重复次数,典型的有以下三种形式:
·\{n\}匹配前面的字符n次。下例匹配的是包含root的行(r和t包含两个o)。
如:grep ‘ro\{2\}t‘ /etc/passwd
·\{n,\}匹配前面的字符至少以上(含n次)
如:grep ‘ro\{1,\}t‘ /etc/passwd
·\{n,m\}匹配前面的字符n,m次

5.“^”符号
这个符号用于匹配开头的字符。比如说‘^root‘匹配的是以字母root开始的行
如:grep ‘^root‘ /etc/passwd

6.“$”符号
和上面的尖角号相对,“$”用于匹配尾部,比如说‘abc$‘代表的是以abc结尾的行。如果‘^$‘则代表该行为空,因为^和$间什么都没有。
下例匹配的是以r开头,中间有一串任意字符,以h结尾的行。
如:grep ‘^r.*h$‘ /etc/passwd

7.“[]”符号
这是一对方括号,用于匹配方括号内出现的任一字符。比如说单项选择题的答案,可能是A、B、C、D选项中的任意一种,
用正则表达式表示就是[ABCD]。如果遇到比较大范围的匹配,比如说要匹配任意一个大写字母,就需要使用“-”号做范围限定,写成[A-Z],
要匹配所有字母则写成[A-Za-z]。一定要注意,这里"-"的作用不是充当一个字符。
如:grep ‘[A-Za-z]‘ test.log
如果要匹配不是大写字母A、B、C、D的字符怎么办呢?用上面提到的“^”,如果这个符号出现在[]中,则代表取反,也就是“不是”的意思。
这种取反不能排除掉既包含字母又包含数字的行
如:grep ‘[^A-D]‘ test.log
举一个例子:看如何匹配手机号?
手机号是11位连续的数字,第一位一定时1,所以1表示为‘^1‘;第二位有可能是3(移动)或8(联通),表示为‘[38]‘,后面9个任意数字,
表示为‘[0-9]\{9\}‘;所以整个表达式应该写为:
‘^1[38][0-9]\{9\}‘
#有缺陷,如果为139999999999,12位的也会匹配出来

8.“\”符号
转义符号,如果想匹配任意长度的点号,是用转义字符就对了:
如;grep ‘\.*‘ test.log

9.“\n”符号
匹配一个换行符

10.“-r”符号
匹配一个回车符

11.“-t”符号
匹配一个制表符

12.“-s”符号
匹配任何空白字符

13.“-S”符号
匹配任何非空白符

 

二、扩展的正则表达式
在使用这些扩展符号时,需要使用egrep命令。
1.‘?’符号
用于匹配前一个字符0次或1次,所以‘ro?t‘仅能匹配rot或rt。

2.‘+’符号
用于匹配前一个字符1次以上,所以‘ro+t‘可以匹配rot、root等。

3.‘|’符号
是‘或’的意思,即多种可能的罗列,彼此间是一种分支关系。比如有些地区固定电话的区号是4位数,
有些地区的却是3位数,这样针对不同的区号就有不同的表示方式,如下所示:
#区号是3位的固定电话的正则表达式方式
^0[0-9]\{2\}-[0-9]\{8\}
#区号是4位的固定电话的正则表达式方式
^0[0-9]\{3\}-[0-9]\{8\}
#两种区号的固定电话号码可以如下写
^0[0-9]\{2,3\}-[0-9]\{8\}
#使用“|”符号也可以,但是显然比上面的方式麻烦
^0[0-9]\{2\}-[0-9]\{8}|^0[0-9]\{3\}-[0-9]\{8\}

4.‘()’符号
通常需要和‘|’符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,
肯能用‘-’符号或者用一个空格连接,用于匹配的正则表达式如下:
#使用‘()’和‘|’定义连接的写法
#这样021-88888888和0511 88888888都可以匹配
^0[0-9]\{2,3\}(-| )[0-9]\{8\}

 

注意:正则表达式主要使用在对文件内容的匹配上,而通配符主要用在文件名的匹配上。

Linux-正则表达式

标签:lin   灵活   表示   转义符   转换   重复   一个   passwd   grep   

原文地址:https://www.cnblogs.com/ysy-love-wy/p/10928934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!