Lex&Yacc---正规表达式语法

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
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh1到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)的开始(<)和结束(>)。例如正则表达式<the>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。

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

 


 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值