Lex & Yacc 学习笔记(3)- 正则表达式语法

lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本。正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成。

元字符

.
. 匹配除了换行符 \n 之外的任意单个字符
例如

.   return yytext[0];

[]
[] 匹配括号中字符的任意一个。
用“-”(短划线)指示字符的范围,例如[0-9]指10个数字中的任意一个。
如果开括号之后的第一个字符是短划线或者闭括号,那么它就不能被解释为元字符。
如果第一个字符是抑扬字符“ ^ ”,那么它的含义就变为匹配括号内字符以外的任意字符。
除了以“ \ ”开始的C转义序列被识别以外,其他的元字符在方括号中没有特殊含义。

例如

[A-Z]+  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现1次以上
[^A-Z]+  {printf("get word:%s\n", yytext);} // 匹配除了大写字母外的其他字符,出现1次以上

*
* 匹配前面正则表达式的零次或者多次出现。

例如

[A-Z]*  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现0次或者多次

+
+ 匹配前面正则表达式的一次或者多次出现。

例如

[A-Z]+  {printf("get word:%s\n", yytext);}// 匹配大写字母,出现1次以上

?
? 匹配前面正则表达式的零次或者一次出现。例如: -?[0-9]+ 指具有可选的前导或者一元减号的数字

例如

[A-Z]?  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现零次或者一次

{}
{} 意味着根据括号内部的不同而不同。单个数字{n}意味着前面的模式重复n次。例如: [A-Z]{3} 表示任意3个大写字母。

如果大括号包含的由逗号分开的两个数字{n,m},那么它们是前面模式重复的最小数和最大数。例如:A{1,3}表示字母A出现1次到3次。

如果第二个数字丢失就意味着无穷大,所以{1,}意味着 + ; {0,}意味着 * 。

如果大括号包含一个名字,它指示用那个名字来替换。

例如

[A-Z]{3}  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现3次
[A-Z]{3,}  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现3次以上
[A-Z]{3,6}  {printf("get word:%s\n", yytext);} // 匹配大写字母,出现3~6次

\
\ 转义符号,如果后面的字符是小写字母,那么它就是C转义序列。 例如制表位:\t

一些实现允许采用如“\123” 和 “\x3f” 这种形式的八进制和十六进制字符。

否则,“\” 引用后面的字符,所以 \* 匹配一个 * 号。

转义字符表

转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜线字符'\' 092
\' 代表一个单引号(撇号)字符 039
\" 代表一个双引号字符 034
\? 代表一个问号 063
\0 空字符(NULL) 000
\ddd 1到3位八进制数所代表的任意字符 三位八进制
\xhh 1到2位十六进制所代表的任意字符 二位十六进制

()
() 将一系列正则表达式归组。 * + {} 中的每一个都直接作用于它左侧的表达式,而且 | 通常同时影响左侧和右侧的内容。圆括号可以改变这种情况,

例如:

(abc){3}  {printf("get word:%s\n", yytext);} // 连续出现3次 abc
(ab|cd){3}  {printf("get word:%s\n", yytext);} // 出现3次:"ab" 或 "cd"

|
| 匹配前面的或者随后的表达式。
例如:

(ab|cd){1}  {printf("get word:%s\n", yytext);} // 出现1次:"ab"或 "cd"

"..."
"..." 逐字匹配引号内的每个字符。不同于“\”的元字符会失去它的含义。
和 () 不同的是,引号内的都是普通字符,没有特殊含义。

例如:“/” 匹配两个字符 /

(\\){1}  {printf("get word:%s\n", yytext);} // 出现1次:"\"
"\\"{1}  {printf("get word:%s\n", yytext);} // 出现1次:"\\"

/
/ 只有当有后面的表达式跟随时才匹配前面的表达式。

例如: 0/1 匹配字符串01中的0 但是不匹配字符串0或者02中的任何字符。

每个模式只允许有一个/ ,并且模式不能同时包含 / 和 $

^
^作为正则表达式的第一个字符,它匹配行的开始;
^在方括号[] 中用于否定。

^[A-Z]* {printf("get word:%s\n", yytext);} // 行开始的所有大写字母串
[^A-Z]*  {printf("get word:%s\n", yytext);} // 匹配非大写字母的字符串

$
$作为正则表达式的最后一个字符,它匹配行的结束

[A-Z]*$ {printf("get word:%s\n", yytext);} // 行末尾的大写字母串

<>
<> 位于模式开头的尖括号内的一个或者一列名字,使那个模式只应用于指定的起始状态。
匹配词(word)的开始(<)和结束(>)。例如正则表达式能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。

<>
<> 只用于flex中,这个特殊模式匹配文件的结尾。

你可能感兴趣的:(Lex & Yacc 学习笔记(3)- 正则表达式语法)