flex中的正则表达式
符号 | 含义 | 例子 |
---|---|---|
[] | 匹配方括号中的任意一个字符 | [0-9]:表示数字0~9中的一个字符 |
\ | 类似C中的转义字符 | |
[a-z]{-}[jv] | 匹配前一个括号减去后一个括号集合中的任意一个字符 | [0-3]{-}[0]:表示字符1、2、3中的任意一个 |
^ | 若是正则表达式的第一个字符就表示行首,也被用于方括号中表示补集 | |
$ | 若是正则表达式的最后一个字符就匹配行尾 | |
{} | 表示前一个模式可以匹配的最小和最大次数 | A{1,2}:表示匹配A或AA 0{3}:表示匹配000 |
* | 匹配零个或多个前一个表达式 | [ \t]*:表示匹配任意个空格或tab,也可以是空白字符 |
+ | 匹配1个或多个前一个表达式 | [0-9]+:匹配数字字符串,如1,11,但不能是空字符串 |
? | 匹配零个或一个前一个表达式 | -?[0-9]+:匹配一个有符号数字 |
| | 匹配紧接在前面的表达式,或者紧跟在后米纳的表示是 | apple|pear:匹配两种水果名字中的任意一个 |
“…” | 所有引号中的字符将基于字面意义被解释 | |
/ | 匹配斜线前的表达式,但要求紧跟着斜线后的表达式,但斜线后的表达式不会被“消耗”,他们会返还给输入以便继续匹配。每个模式只允许一个该操作符 | 0/1:匹配01中的0,但不会匹配0或02 |
() | 把一系列的正则表达式组成一个新的正则表达式。 | a(bc|de):匹配abc或者ade |
重复匹配的操作符总是针对邻近的表达式。或者可以使用括号来扩大表达式范围
二义模式
相同的输入可能被不同的模式匹配。flex的解决方法:
- 匹配更多的字符串
- 若两个模式都可匹配,则匹配更早出现的
"+" { return ADD; }
"=" { return ASSIGN; }
"+=" { return ASSIGNADD; }
// 字符串+=匹配为ASSIGNADD,因为更长
"if" { return KEYWORDIF; }
"else" { return KEYWORDELSE; }
[a-zA-z_][a-zA-Z0-9_]* { return IDENTIFIER; }
// keyword匹配优先于identitfier