Linux系统编程(17)——正则表达式进阶
来源:互联网 发布:mysql error1054 编辑:程序博客网 时间:2024/05/12 11:40
C的变量和Shell脚本变量的定义和使用方法很不相同,表达能力也不相同,C的变量有各种类型,而Shell脚本变量都是字符串。同样道理,各种工具和编程语言所使用的正则表达式规范的语法并不相同,表达能力也各不相同,有的正则表达式规范引入很多扩展,能表达更复杂的模式,但各种正则表达式规范的基本概念都是相通的。
如果要用grep查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息:
字符类:如上例的x和y,它们在模式中表示一个字符,但是取值范围是一类字符中的任意一个。
数量限定符:邮件地址的每一部分可以有一个或多个x字符,IP地址的每一部分可以有1-3个y字符
各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符@和.隔开,IP地址分四部分,用.隔开,每一部分都可以用字符类和数量限定符描述。为了表示位置关系,还有位置限定符的概念。
规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式。
字符类
字符
含义
举例
.
匹配任意一个字符
abc.可以匹配abcd、abc9等
[]
匹配括号中的任意一个字符
[abc]d可以匹配ad、bd或cd
-
在[]括号内表示字符范围
[0-9a-fA-F]可以匹配一位十六进制数字
^
位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符
[^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1、b1但不匹配x1、y1
[[:xxx:]]
grep工具预定义的一些命名字符类
[[:alpha:]]匹配一个字母,[[:digit:]]匹配一个数字
数量限定符
字符
含义
举例
?
紧跟在它前面的单元应匹配零次或一次
[0-9]?\.[0-9]匹配0.0、2.3、.5等,由于.在正则表达式中是一个特殊字符,所以需要用\转义一下,取字面值
+
紧跟在它前面的单元应匹配一次或多次
[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+匹配email地址
*
紧跟在它前面的单元应匹配零次或多次
[0-9][0-9]*匹配至少一位数字,等价于[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C语言的标识符
{N}
紧跟在它前面的单元应精确匹配N次
[1-9][0-9]{2}匹配从100到999的整数
{N,}
紧跟在它前面的单元应匹配至少N次
[1-9][0-9]{2,}匹配三位以上(含三位)的整数
{,M}
紧跟在它前面的单元应匹配最多M次
[0-9]{,1}相当于[0-9]?
{N,M}
紧跟在它前面的单元应匹配至少N次,最多M次
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}匹配IP地址
再次注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。再举个例子,如果文本文件的内容是
aaabcaadefg
查找a*这个模式的结果是三行都被找出来了
$ egrep 'a*' testfileaabcaadefg
a*匹配0个或多个a,而第三行包含0个a,所以也包含了这一模式。单独用a*这样的正则表达式做查找没什么意义,一般是把a*作为正则表达式的一部分来用。
常用的元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。
这里的{5,12}和前面介绍过的{2}是类似的,只不过{2}匹配只能不多不少重复2次,{5,12}则是重复的次数不能少于5次,不能多于12次,否则都不匹配。
因为使用了^和$,所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须是5到12个数字,因此如果输入的QQ号能匹配这个正则表达式的话,那就符合要求了。
和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配行的开始处和结束处。
位置限定符
字符
含义
举例
^
匹配行首的位置
^Content匹配位于一行开头的Content
$
匹配行末的位置
;$匹配位于一行结尾的;号,^$匹配空行
\<
匹配单词开头的位置
\<th匹配... this,但不匹配ethernet、tenth
\>
匹配单词结尾的位置
p\>匹配leap ...,但不匹配parent、sleepy
\b
匹配单词开头或结尾的位置
\bat\b匹配... at ...,但不匹配cat、atexit、batch
\B
匹配非单词开头和结尾的位置
\Bat\B匹配battery,但不匹配... attend、hat ...
位置限定符可以帮助grep更准确地查找,例如上一节我们用[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}查找IP地址,找到这两行
192.168.1.11234.234.04.5678
如果用^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$查找,就可以把1234.234.04.5678这一行过滤掉了。
其它特殊字符
字符
含义
举例
\
转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符
普通字符<写成\<表示单词开头的位置,特殊字符.写成\.以及\写成\\就当作普通字符来匹配
()
将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
([0-9]{1,3}\.){3}[0-9]{1,3}匹配IP地址
|
连接两个子表达式,表示或的关系
n(o|either)匹配no或neither
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\。
- Linux系统编程(17)——正则表达式进阶
- Linux系统编程(16)——正则表达式入门
- Linux系统编程(18)——正则表达式实用举例
- Linux系统编程(19)——正则表达式在sed和awk中的使用
- 正则表达式——进阶
- linux系统之shell编程-正则表达式
- grep进阶——运用正则表达式
- 编程算法基础-2.5正则表达式进阶
- Java编程基础-正则表达式进阶
- [ 正则 ]正则表达式进阶!
- 【正则表达式】正则表达式进阶
- Linux Shell 脚本编程(5)—文本过滤(正则表达式)
- Linux Shell编程-正则表达式
- linux——正则表达式
- Linux——正则表达式
- linux—shell正则表达式
- 算法基础——2.5正则表达式进阶
- 算法基础——2.5正则表达式进阶
- HDU 2017 字符串统计
- MFC类内创建线程,使用内部变量方法
- Java基础02 方法与数据成员
- 统计推断week3
- 802.11协议基础
- Linux系统编程(17)——正则表达式进阶
- Linux下C++程序中的内存泄露检查
- getline(cin,str)与cin.getline(str)的用法
- HDU 1565 & HDU 1569 方格取数 | 最大点权独立集
- Linux系统编程(18)——正则表达式实用举例
- 个那个饭南京话郭敬明
- 设计模式之-----------单例设计模式
- HDU_3783 ZOJ
- HDU 2604-Queuing