在词法分析中,我们需要利用正则表达式来匹配特定的字符串,因此需要了解常用的正则表达式规则
规则
. 匹配除换行符(\n)以外的任意单字符
[] 字符类,可以匹配方括号中的任意一个字符,如果字符类中的第一个字符为^,则匹配除方括号内字符以外的任何字符,有点类似于操作符中“非”的意思。字符里的破折号表示字符的范围,例如[0-9],意思是要匹配[0123456789],[a-z]意思是要匹配任意小写字母。
^ 如果是正则表达式的第一个字符就匹配行首,在[]中表示补集
$ 如果它是正则表达式的最后一个字符就匹配行尾
{} 当花括号中带有一个或者两个数字时,它就表示前一个模式的最小和最大次数,例如 A{1,3}表示匹配一到三个字母A,而0{5}匹配00000,当花括号中带有名字时,它指向以这个名字命名的模式
\ 用来表示元字符本身和一部分常用的C语言转义序列,例如\n表示换行符,\*则表示子面意义上的星号
* 匹配零个或者多个紧接在前面的表达式,例如[ \t]可以匹配任意多个空格和tab
+ 匹配一个或者多个紧接在前面的表达式,例如[0-9]+可以匹配数字字符串,例如1,123456等。
? 匹配零个或者一个紧接在前面的表达式,例如-?[0-9]+可以匹配所有的正负数(正数前面不能有+号)
| 选择操符,匹配紧接在前面的表达式或者紧跟在后面的表达式,例如zhangsan|lisi|wangwu匹配这三个人名中的任何一个
"..." 所有引号中的字符将基于子面意义被解释,在编写正则表达式的过程中,比较好的做法是用引号引起所有需要基于字面意义匹配的标点符号
() 把一系列的正则表达式组成一个新的正则表达式,例如(01)匹配字符序列01,a(bc|de)可以匹配abc或者ade,圆括号在建立带有,+,?和|的复杂模式时非常有用
/ 尾部上下文,匹配斜杠前的正则表达式,但是要求其后紧跟斜线后的表达式,例如0/1匹配字符串01中的0,但是不会匹配字符串0或者02,斜线后面的内容不会被“消耗掉”,它们会返还给输入以便于继续匹配,每个模式只允许一个尾部上下文操作符
示例
[-+]?([0-9].?[0-9]+|[0-9]+.) 匹配一个可以带正负号的数字,并且还可以表示小数
[-+]? 表示可以带+号或者-号
[0-9]表示任何一个数字
.? 表示可以带小数点,也可以不带
[0-9]+ 表示至少有一个数字
| 表示或的关系
[0-9]+. 表示整数后面带小数点的情况,例如 12.