pattern要用""括起来吗
无特殊意义的普通字符组成的pattern可用可不用。
用于正则表达式的pattern一旦被""括起来,特殊字符就失去了作用,所以不能用""。
特殊字符可用"",也可用\使其失去特殊作用,变成普通字符。
有些字符只能用转义的方式表示,例如\t、\n,不能用""。
如果pattern中包含空格,用空格更方便。
例:
%%
hello {printf("match hello\n");}
"world" {printf("match world\n");}
"[]" {printf("match []\n");}
\(\) {printf("match ()\n");}
\n {printf("match newline\n");}
"\\n" {printf("match \\n\n");}
%%
image.png
精确pattern(纯字符串)与模糊pattern(正则表达式)有优先级吗
没有,精确pattern并不比模糊pattern优先级更高。
flex会尽量匹配更多的字符。不会在遇到一个完全匹配的精确pattern时就停止匹配,而是尝试继续往后匹配,能匹配多长就匹配多长。
例如:
%%
"hello world" {printf("match hello\n");}
"hello "[a-z]+ {printf("match hello regex\n");}
%%
image.png
如果输入"hello world"确实会匹配到第一个规则。
image.png
这里也并不是因为精确pattern比模糊pattern优先级高,纯粹只是精确pattern规则排在模糊pattern规则前面而已。如果把两条规则的顺序调换一下,flex会报警告:
image.png
匹配规则的先后顺序有关系吗
如前所述,匹配规则的顺序定义是有关系的。总的来说,flex匹配pattern的规则就是:
- 尽量匹配更多的字符
- 如果多条规则匹配到的字符一样,那么选择第一条规则
所以,书写规则的时候,越精确的规则放到越前面,越模糊的规则放到越后面。
%%
[0-9]+ {printf("match 1111\n");}
[0-9a-zA-Z]+ {printf("match 22222\n");}
%%
image.png