正则表达式

正则表达式(Regular Expression,RE)就是由一系列特殊字符组成的字符串。其中每个特殊字符都被称为元字符,这些元字符并不表示它们字面上的含义,而是被解释为一些特定的含义。

正则表达式是由普通字符和元字符共同组成的集合,这个集合用来匹配(或指定)模式。正则表达式的主要功能是文本查询和字符串操作,正则表达式可以匹配文本的一个字符或字符集合。

例如,a、b、1、2等字符属于普通字符,普通字符可以按照字面意思理解,如a只能理解为英文的小写字母a,没有其他隐藏含义。而*、^、[ ]等元字符,shell赋予了它们超越字面意思的意义,如*符号的字面意义只是一个符号,而实际上却表示了重复前面的字符0次或多次的隐藏含义。

正则表达式的组成

一个正则表达式包含下列一项或多项。

  • 一个字符集:这里所指的字符集只包含普通字符,这些字符只表示它们的字面含义。正则表达式的最简单形式就是只包含字符集,而不包含元字符。

  • 锚:锚指定了正则表达式所要匹配的文本在文本行中所处的位置,如^和$就是锚。

  • 修饰符:它们扩大或缩小(修改)了正则表达式匹配文本的范围。修饰符包含星号、括号和反斜杠。

正则表达式中常用的一些符号以及对应的意义见下表

正则表达式中符号含义

其中:

*

*用于匹配前面一个普通字符的0次或多次重复,例如,hel*o,*符号前面的普通字符是l,
*字符就表示匹配l字符0次或多次,如字符串helo、hello、hellllllo都可以由hel*o来表示。

.

.用于匹配任意一个字符,例如,…73. 表示前面3个字符为任意字符,
第4和第5个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U都能匹配上述字符串。

^

^用于匹配行首,表示行首的字符是^字符后面的那个字符,
例如:^cloud表示匹配以cloud开头的行

$

$匹配行尾,$放在匹配字符之后,例如,micky$表示匹配以micky结尾的所有行,^$表示匹配空白行。

[]

[]匹配字符集合,在正则表达式中,将匹配中括号字符集中的某一个字符,例如:

[xyz]将会匹配字符x、y、或z

[c-n]匹配字符c~n之间的任意一个字符

[B-Pk-y]匹配从B~P,或者从k~y之间的任意一个字符

[a-z0-9]匹配任意小写字母或数字

[^b-d]将会匹配范围在b~d之外的任意一个字符。这就是使用^对字符集取反的一个实例

将多个中括号字符集组合使用,能够匹配一般的单词或数字,例如,[Yy][Ee][Ss]能够匹配yes、Yes、YES、yEs等,[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]可以匹配社保码

案例

[root@localhost ~]# cat test.txt
Hello
World
1
Linux
2
Windows
Windowss
Windowsss
Windowssss
ssWindowssss
sssWindowssss
ssssWindowssss
Mac
Maac
Maaac
Maaaac
Macc
Mac Mac
Mac123
Mac112233
grep "[^a-zA-Z]" test.txt

从输出可以看出,精确匹配了test.txt文件中所有的非字符内容。

\用来转义某个特殊含义的字符,这意味着,这个特殊字符将会被解释为字面含义。
\$将会被解释成字符$,而不是RE中匹配行尾的特殊字符。相似的,\\将会被解释为字符\
转义的尖括号\<...\>用于匹配单词边界,尖括号必须被转义才含有特殊的含义,否则它就表示尖括号的字面含义
\<the\>完整匹配单词the,不会匹配them、there、other等
\{\}系列符号表示前一个字符的重复次数
\{n\}匹配前面字符出现n次,如JO\{3\}B匹配JOOOB
\{n,\}匹配前面字符至少出现n次,如JO\{3,\}B匹配JOOOB、JOOOOB、JOOOOOB等字符串
\{n,m\}匹配前面字符出现n次与m次之间,如JO\{3,6\}B匹配JOOOB、JOOOOOOB等字符串

例如,[a-z]\{5\}匹配5个小写英文字母,如hello、house等

注:使用grep匹配正则时,正则要用双引号引起来

Last updated