正则表达式是一种符号表示法,被用来识别文本模式。它以行为单位进行字符串的处理操作
编程语言(java、perl和python)、Linux实用工具(比如vi、sed编辑器、gawk程序和grep工具)以及主流应用(比如MySQL和PostgreSQL数据库服务器)可能会用不同类型的正则表达式。
正则表达式是通过正则表达式引擎实现的,在Linux中有两种流行的正则表达式引擎:
- POSIX基础正则表达式引擎,BRE引擎
- POSIX扩展正则表达式引擎,ERE引擎
基础正则表达式——BRE模式
BRE模式的元字符是:锚字符、点号字符、字符组、星号
1.纯文本
正则表达式模式都区分大小写,空格和其他的字符没有区别。
2.特殊字符
正则表达式识别的特殊字符包括:.*[]^${}\+?|()
只要特殊字符作为文本字符,就必须转义,即在特殊字符前面加转义符(反斜杠\)。
匹配词,而不是匹配字符,使用\<word\>,因为<>需要表示匹配word单词的功能时必须转义。这样就会单词匹配了。例如匹配love单词,则只会匹配l love China,而不会匹配My gloves are red。
3.锚字符 ^ $
有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾,脱字符(^),美元符($)。
脱字符使用时必须将它放在正则表达式的前面,若在模式开头的其他位置,则和普通字符一样了。
美元符使用时必须将它放在正则表达式的结尾,若在模式结尾的其他位置,则和普通字符一样了。
4.点号字符 .
.用来匹配除换行符之外的任意单个字符,它必须匹配一个字符。
5.字符组 []
(1)使用方括号来定义一个字符组。比如[12345]
(2)排除型字符组:只需要在字符组的开头加个脱字符,比如[^12345],注意!在正则表达式中是普通字符,不能表达反向选择。
(3)区间:用单破折号在字符组中表示字符区间,适合数字、大小写字母。比如[12-5]
(4)特殊字符组:使用特殊字符组用来匹配特定类型的字符,如下:
组 | 描述 |
---|---|
[:alnum:] | 匹配任何字母数字。等价于A-Za-z0-9 |
[:word:] | 于[[:alnum:]]相同,但增加了下划线字符 |
[:alpha:] | 字母字符,等价于A-Za-z |
[:blank:] | 包含空格和tab字符 |
[:digit:] | 数字0-9 |
[:graph:] | 可视字符,在ASCII中,它包含33到126的字符 |
[:print:] | 可打印字符,在[[:graph:]]中的所有字符,再加上空格字符 |
[:lower:] | 小写字母a-z |
[:upper:] | 大写字母A-Z |
[:space:] | 匹配任意空白字符:空格、制表符、回车、换行等价于\t\r\n\v\f |
[:punct:] | 匹配标点符号 |
例如,一个字符串是否是一句话,即字符串开始于一个大写字母,然后包含任意多个大写小写的字母和空格,最后以句号收尾。
[[:upper:]][[:upper:][:lower:] ]*\.
排除型字符,比如[^[:upper:]]排除A-Z之外的其他字符,一定要且必需要匹配一个字符,空格字符属于这个范围。
6.星号 *
星号前面的字符可以出现0次或者多次。
点号特殊字符和星号特殊字符的组合能匹配任意数量的任意字符。它通常用在数据流中两个可能相邻或不相邻的文本字符串之间。
星号用在字符组上时,它可以指定文本中出现多次的字符组或者字符区间,比如[abc]*,[a-c]*,[[:lower:]]*.
扩展正则表达式——ERE模式
在BRE模式的基础上扩展了元字符。
注意,只有在用反斜杠进行转义的情况下,字符“(”、“)”、“{”和“}”才会在扩展正则表达式(ERE)中被当作元字符处理,而在基本正则表达式(BRE)中,任何元字符前面加上反斜杠反而会使其被当作普通字符来处理
1.问号 ?
问号前面的字符可以出现0次或者1次,是限定符。
2.加号 +
加号前面的字符可以出现1次或者多次,但至少出现1次。
3.花括号 {}
匹配特定个数的元素。{m}匹配前面的元素,准确出现m次;{m,n}匹配前面的元素至少出现m次,至多n次;{m,}匹配前面的元素,至少出现m次;{,n}匹配前面的元素,至多出现n次。
\{m,n\},\{m\},\{m,\},\{,n\}
因为{}符号在shell中也是有特殊意义的,因此,必须使用转义符\让它失去特殊意义,仅生效正则匹配的功能。比如grep -n 'o\{2,5\}' regular_express.txt 在txt文本中找到至少两个oo,最多5个o的字符串。
4.管道符号 |
用逻辑或方式指定正则表达式引擎要用的两个或多个模式。
正则表达式和管道符号之间不能有空格,否则空格也会被认为正则表达模式的一部分,管道符号两侧的正则表达式可以采用任何正则表达模式(包括字符组)来定义文本。
格式是expr1|expr2|expr3|...
5.表达式分组()
用圆括号进行分组。分组时,该组会被视为一个标准字符,可以像对普通字符一样给该组字符使用特殊字符,比如Sat(urday)?,可以匹配完整的Saturday或者Sat。
常见地,会将分组和管道符号一起使用来创建可能的模式匹配组。比如(c|b)a(b|t),可以匹配第一组中字母的任意组合以及第二组字母的任意组合,即cab,cat,bab,bat。
常见地,和加号一起使用,表示多个重复群组的判别。比如,echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C';表示开头是A结尾是C,中间有一个以上的xyz字符串。