正则表达式
来源:互联网 发布:mac inode en4 编辑:程序博客网 时间:2024/06/03 19:02
1. 引言
正则表达式(Regular Expression):规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式
例如:email地址的正则表达式可以写成[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+
IP地址的正则表达式可以写成[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
有这样一个文本文件testfile:
192.168.1.11234.234.04.5678123.4234.045.678abcde
查找其中包含IP地址的行:
$ egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' testfile192.168.1.11234.234.04.5678
egrep
相当于grep -E
,表示采用Extended正则表达式语法。grep
的正则表达式有Basic和Extended两种规范,它们之间的区别下一节再解释。另外还有fgrep
命令,相当于grep -F
,表示只搜索固定字符串而不搜索正则表达式模式,不会按正则表达式的语法解释后面的参数。注意正则表达式参数用单引号括起来了,因为正则表达式中用到的很多特殊字符在Shell中也有特殊含义(例如\),只有用单引号括起来才能保证这些字符原封不动地传给grep
命令,而不会被Shell解释掉。
2. 基本语法
本节介绍egrep(1)
所使用的正则表达式,它大致上符合POSIX正则表达式规范。字符类
.
匹配任意一个字符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*' testfile aabcaadefg
a*
匹配0个或多个a
,而第三行包含0个a
,所以也包含了这一模式。单独用a*
这样的正则表达式做查找没什么意义,一般是把a*
作为正则表达式的一部分来用。
位置限定符
^
匹配行首的位置^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
0 0
- 【正则表达式】正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- Android开源工具库
- 一步步学习SPD2010--第十一章节--处理母版页(6)--改变默认母版页
- 查看oracle数据库是否归档和修改归档模式
- 出现次数最多的数
- powerdesigner使用
- 正则表达式
- IOS学习笔记11-如何判断推送开关是否打开
- oracle函数大全
- Web前端性能优化全攻略
- Ubuntu 12.04 LTS 中文输入法的安装
- 七种排序算法总结
- 内存调试的东西D/dalvikvm( 809 ): GC_CONCURRENT freed
- sleep和wait的区别
- 页面有的参数,在action中没有报错