原文地址
正则表达式在Unix/Liunx系统中起着非常重要的作用,在很大一部分的程序中都使用了正则表达式,可以这么说:“在Unix/Linux系统中,如果不懂正则表达式就不算会使用该系统”。本文中使用的Lex和Yacc都是基于正则表达式的应用,因此有必要用一篇文档的形式详细说明在Lex和Yacc中使用的正则表达式为何物!
其实正则表达式非常简单,用过DOS的人都知道通配符吧,说得简单一点,正则表达式就是稍微复杂一点的通配符。这里的正则表达式非常简单,规则非常少,只需要花上几分钟就可以记住。正则表达式的元字符列表如下:
元字符 | 匹配内容 |
. | 除了换行符之外的任意字符 |
\n | 换行符 |
* | 0次或者多次匹配 |
+ | 1次或者多次匹配 |
? | 0次或者1次匹配 |
^ | 行首 |
$ | 行尾 |
a|b | a或者b |
(ab)+ | ab的一次或者多次匹配 |
“a+b” | a+b(字面意思) |
[] | 一类字符 |
有了上面的元字符之后,就可以用上面的元字符表达出非常复杂的匹配内容出来,就像DOS名令中的通配符可以匹配多个指定规则的文件名一样。现在让我们看看上面的元字符的一些应用例子,列表如下:
表达式 | 匹配内容 |
abc | abc |
abc* | abc abcc abccc abcccc …… |
abc+ | abcc abccc abcccc …… |
a(bc)+ | abcbc abcbcbc abcbcbcbc …… |
a(bc)? | abc abcbc |
[abc] | a b c其中之一 |
[a-z] | a b c d e f g… … z其中之一 |
[a\-z] | a – z 三个字符其中之一 |
[-az] | – a z 三个字符其中之一 |
[A-Za-z0-9]+ | 大小写字符和10个数字的一个或多个 |
[ \t\n] | 空格,跳格,换行三者之一(空白符) |
[^ab] | 除了ab之外的任意字符 |
[a^b] | a ^ b 三者之一 |
[a|b] | a | b 三者之一 |
a|b | a b 两者之一 |
^abc$ | 只有abc的一行 |
注意*和+的区别,通配符只是匹配之前最近的元素,可以用小括号将多个元素括起来,整个括号括起来的整体可以看作是一个元素。那么通配符就可以匹配整个括号的内容了。
方括号表示的是一类字符,[abc]就是定义了只有abc三个字符的一类字符。这一点和abc不同,如果跟上通配符(*+?)的话,那么方括号就可以表示前面的任意的字符之一的一个字符的多个匹配,但是abc的话就只能是c的多个匹配了。说的更明白点就是DOS里面的通配符*表示的是任意字符的零个或者多个,而这里的方括号就是把DOS里面的任意字符类缩小为只有方括号表示的类了。另外还要注意连字符-在方括号中的意思,在方括号的中间表示“范围”的意思,而在首部则仅仅表示自己而已。
转义用\,这和C语言类似,另外还需要注意三个特殊的元字符(^ | $)的意义。‘^’放在方括号的首部表示“除了”的意思,在其他地方没有特别意义。‘|’不在方括号中表示“或者”,‘$’通常表示行尾。
通过上面的注释可以看出:使用正则表达式可以表示非常复杂的匹配内容。