正则表达式的主要应用对象是文本,使用正则表达式可以指定想要匹配的字符串规则,然后通过这个规则来匹配、查找、替换或切割那些符合指定规则的文本。总体来讲,正则表达式可以对指定的文本实现以下功能:
匹配验证: 判断给定的字符串是否符合正则表达式所指定的过滤规则,从而可以判断某个字符串的内容是否符合特定的规则(如email地址、手机号码等);当正则表达式用于匹配验证时,通常需要在正则表达式字符串的首部和尾部加上^和$,以匹配整个待验证的字符串。
查找与替换: 判断给定字符串中是否包含满足正则表达式所指定的匹配规则的子串,如查找一段文本中的所包含的IP地址。另外,还可以对查找到的子串进行内容替换。
字符串分割与子串截取: 基于子串查找功能还可以以符合正则表达式所指定的匹配规则的字符串作为分隔符对给定的字符串进行分割。
元字符 | 功能 | 备注 |
---|---|---|
. | 匹配除了换行符以外的任意单个字符 | a. 代表ab ac ad |
* | 前导字符出现0次或连续多次 | a* 代表a ab abc |
.* | 任意长度字符 | a.* 代表a ab abc |
^ | 行首(以…开头) | ^a 代表ab ac |
$ | 行尾(以…结尾) | a$ 代表 ba ca bca |
^$ | 空行 | |
[] | 匹配括号里任意单个字符或一组单个字符 | [ab] 代表a或b,[a-z]代表26个英文字母 |
[^] | 匹配不包含括号里任一单个字符或一组单个字符 |
[^a-z] 匹配出数字 |
< | 取单词的头 | "\<hello" 用于匹配以hello开头的单词 |
> | 取单词的尾 | "hello\>" 则匹配以hello结尾的单词 |
< > | 精确匹配 | "\<hello\>" 匹配以hello为单词 |
{n} | 匹配前导字符连续出现n次 | "ro{2}t" 匹配root |
{n,} | 匹配前导字符至少出现n次 | "ro{2,}t" 匹配root,rooot,roooot |
{n,m} | 匹配前导字符出现n次与m次之间 | "ro{2,3}t" 匹配root,rooot |
( ) | 保存被匹配的字符 | |
\d | 匹配数字(grep -P) | [0-9] |
\w | 匹配字母数字下划线(grep -P) | [a-zA-Z0-9_] |
\s | 匹配空格、制表符、换页符(grep -P) | [\t\r\n] |
扩展元字符 | 功能 | 备注 |
---|---|---|
+ | 匹配一个或多个前导字符 | "ab+c" 匹配abc,abbc |
? | 匹配零个或一个前导字符 | "ab?c" 匹配abc,不会匹配abbc |
| | 或 | 匹配a或b |
() | 组字符(看成整体) | (my|your)self:表示匹配myself或匹配yourself |
正则表达式要用egrep,下面距离一些常用的正则表达方式
一、正则表达式
1.\<和\>
这两个符号分别用于界定单词的左边界和右边界。
比如说"\<hello"用于匹配以hello开头的单词;"hello\>"则匹配以hello结尾的单词;
"\<hello\>"匹配以hello为单词
举例:
2. “.” (一个点)符号;
点符号用于匹配除换行符之外的任意一个字符。记住是单个字符,除去换行符。
例如:r.t可以匹配rot、rat,但是不能匹配root,
若使用r..t(两个点)就可以匹配root、ruut
3.“ * ” 符号:
用于匹配前一个字符0次或任意多次
比如ab*,可以匹配a、ab、abc等。
“*”号经常和“.”号加在一起使用。
比如“.*”代表任意长度的不包含换行的字符。
4.“{n,m}”符号:
虽然*可以用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用“{n,m}”符号则能更加灵活的控制字符的重复次数,典型的有以下三种形式:
{n}匹配前面的字符n次。下例匹配的是包含root的行(r和t包含两个o)。
{n,}匹配前面的字符至少以上(含n次)
{n,m}匹配前面的字符n,m次
5.“^”符号
这个符号用于匹配开头的字符。比如说'^root'匹配的是以字母root开始的行
[root@master ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
6.“$”符号
和上面的尖角号相对,“$”用于匹配尾部,比如说'abc$'代表的是以abc结尾的行。如果'^$'则代表该行为空,因为^和$间什么都没有。
下例匹配的是以r开头,中间有一串任意字符,以h结尾的行。
如:
[root@master ~]# grep '^r.*h$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
7.“[ ]”符号
这是一对方括号,用于匹配方括号内出现的任一字符。比如说单项选择题的答案,可能是A、B、C、D选项中的任意一种,
用正则表达式表示就是[ABCD]。如果遇到比较大范围的匹配,
比如说要匹配任意一个大写字母,就需要使用“-”号做范围限定,写成[A-Z],
要匹配所有字母则写成[A-Za-z]。一定要注意,这里"-"的作用不是充当一个字符。
如果要匹配不是大写字母A、B、C、D的字符怎么办呢?用上面提到的“^”,如果这个符号出现在[]中,则代表取反,也就是“不是”的意思。
举例:看如何匹配手机号?
手机号是11位连续的数字,第一位一定时1,所以1表示为'^1';第二位有可能是3(移动)或8(联通),表示为'[38]',后面9个任意数字,
表示为'[0-9]{9}';所以整个表达式应该写为:
'^1[38][0-9]\{9\}'
13123456789
8.“\”符号
转义符号,如果想匹配特殊字符,是用转义字符就对了:
如:
'\[\]' 匹配出文件中[]小括号
9.“\n”符号
匹配一个换行符
10.“-r”符号
匹配一个回车符
11.“-t”符号
匹配一个制表符
12.“-s”符号
匹配任何空白字符
13.“-S”符号
匹配任何非空白符
二、扩展的正则表达式
在使用这些扩展符号时,需要使用egrep命令。
1."?" 符号
用于匹配前一个字符0次或1次,所以'ab?c'仅能匹配ac或abc。
2."+" 符号
用于匹配前一个字符1次以上,所以'ab+c'可以匹配abc,abbc等,但匹配不了ac
3."()" 符号
通常需要和‘|’符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,
肯能用‘-’符号或者用一个空格连接,用于匹配的正则表达式如下:
使用‘()’和‘|’定义连接的写法
0[0-9]{2,3}(#|@)[0-9]{8} 有#或者@连接符号
这样021#88888888和0511@88888888都可以匹配