正则表达式

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.1
1234.234.04.5678
123.4234.045.678
abcde

查找其中包含IP地址的行:

$ egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' testfile
192.168.1.1
1234.234.04.5678
egrep相当于 grep -E,表示采用Extended正则表达式语法。 grep的正则表达式有Basic和Extended两种规范,它们之间的区别下一节再解释。另外还有 fgrep命令,相当于 grep -F,表示只搜索固定字符串而不搜索正则表达式模式,不会按正则表达式的语法解释后面的参数。

注意正则表达式参数用单引号括起来了,因为正则表达式中用到的很多特殊字符在Shell中也有特殊含义(例如\),只有用单引号括起来才能保证这些字符原封不动地传给grep命令,而不会被Shell解释掉。

2. 基本语法

本节介绍 egrep(1)所使用的正则表达式,它大致上符合POSIX正则表达式规范。

 字符类

字符含义举例
.匹配任意一个字符abc.可以匹配abcdabc9
[]匹配括号中的任意一个字符[abc]d可以匹配adbdcd
-[]括号内表示字符范围[0-9a-fA-F]可以匹配一位十六进制数字
^位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符[^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1b1但不匹配x1y1
[[:xxx:]]grep工具预定义的一些命名字符类[[:alpha:]]匹配一个字母,[[:digit:]]匹配一个数字

 数量限定符

字符含义举例
?紧跟在它前面的单元应匹配零次或一次[0-9]?\.[0-9]匹配0.02.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}匹配从100999的整数
{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找的是包含某一模式的行,而不是完全匹配某一模式的行。再举个例子,如果文本文件的内容是

aaabc
aad
efg

查找a*这个模式的结果是三行都被找出来了

$ egrep 'a*' testfile 
aabc
aad
efg

a*匹配0个或多个a,而第三行包含0个a,所以也包含了这一模式。单独用a*这样的正则表达式做查找没什么意义,一般是把a*作为正则表达式的一部分来用。

位置限定符

字符含义举例
^匹配行首的位置^Content匹配位于一行开头的Content
$匹配行末的位置;$匹配位于一行结尾的;号,^$匹配空行
\<匹配单词开头的位置\<th匹配... this,但不匹配ethernettenth
\>匹配单词结尾的位置p\>匹配leap ...,但不匹配parentsleepy
\b匹配单词开头或结尾的位置\bat\b匹配... at ...,但不匹配catatexitbatch
\B匹配非单词开头和结尾的位置\Bat\B匹配battery,但不匹配... attendhat ...

位置限定符可以帮助grep更准确地查找,例如上一节我们用[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}查找IP地址,找到这两行

192.168.1.1
1234.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)匹配noneither



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值