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)的开始(<)和结束(>)。例如正则表达式<the>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容