lex和yacc
Lex和Yacc从入门到精通(PDF)

Lex和Yacc从入门到精通熊春雷Abstract在开发程序的过程中经常会遇到文本解析的问题,例如:解析C语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用C或者 C++直接编写解析程序,这对于简单格式的文本信息来说,不会是什么问题,但是 对于稍微复杂一点的文本信息的解析来说,手工编写解析器将会是一件漫长痛苦 而容易出错的事情。
本系列文档就是专门用来由浅入深的介绍两个有名的Unix工 具Lex和Yacc,并会一步一步的详细解释如何用这两个工具来实现我们想要的任何 功能的解析程序,为了方便理解和应用,我会在该系列的文章中尽可能的采用具 体可行的实例来加以阐释,而且这种实例都是尽可能的和具体的系统平台无关的 ,因此我采用命令行程序作为我们的解析程序的最终结果。
1、环境配置篇开发Lex和Yacc程序最需要的程序就是lex和yacc了,如果你是Unix或者Linux系统,则 系统自带了这两个工具,无需安装,不过值得说明的是GNU/Linux下面的Lex是flex, 而Yacc则是bison。
另外需要的就是一个C/C++语言编译器,由于我们采用的是GNU的 lex和yacc,所以,理所当然的我们就使用GNU的编译器了,如果是Unix或者Linux系统 ,那么编译器应该已经安装了。
在这里我重点讨论的是Windows系统环境下的Lex和 Yacc程序的开发,至于为什么选择Windows系统作为开发平台,则是为了尽可能的让初 学者容易入门。
1.1.必备工具言归正传,首先列举Windows平台下面Lex和Yacc开发环境所需要安装的程序:1.Lex(flex.exe)和Yacc(bison.exe)环境2.C/C++编译器1.2.flex和bison值得说明的是,flex.exe和bison.exe是UnxUtils包中的文件,已经将许多 Unix/Linux平台的程序都移植到了Windows平台,可以直接到UnxUtils网站下载,下载解压缩之后在系统的PATH环境变量中增加UnxUtils所有的exe文件所在的目录,使 得DOS命令行可以直接搜索到flex.exe和bison.exe,除此之外还需要从网络上下载 bison需要的bison.simple和bison.hairy两个文件,并且还要分别设置环境变量 BISON_HAIRY指向bison.hairy,BISON_SIMPLE指向bison.simple。
编译原理-实验二-FLEX词法分析器

编译原理-实验⼆-FLEX词法分析器FLEX词法分析器⼀、Lex和Yacc介绍Lex 是⼀种⽣成扫描器的⼯具。
扫描器是⼀种识别⽂本中的词汇模式的程序。
⼀种匹配的常规表达式可能会包含相关的动作。
这⼀动作可能还包括返回⼀个标记。
当 Lex 接收到⽂件或⽂本形式的输⼊时,它试图将⽂本与常规表达式进⾏匹配。
它⼀次读⼊⼀个输⼊字符,直到找到⼀个匹配的模式。
如果能够找到⼀个匹配的模式,Lex 就执⾏相关的动作(可能包括返回⼀个标记)。
另⼀⽅⾯,如果没有可以匹配的常规表达式,将会停⽌进⼀步的处理,Lex 将显⽰⼀个错误消息。
Yacc代表 Yet Another Compiler Compiler 。
Yacc 的 GNU 版叫做 Bison。
它是⼀种⼯具,将任何⼀种编程语⾔的所有语法翻译成针对此种语⾔的 Yacc 语法解析器。
(下载下载flex和bison。
⽹址分别是/packages/flex.htm和/packages/bison.htm。
)⼆、配置环境(win7)①下载flex和bison并安装到D:\GnuWin32(尽量是根⽬录)②由于我们使⽤的flex和bison都是GNU的⼯具,所以为了⽅便,采⽤的C/C++编译器也采⽤GNU的编译器GCC,当然我们需要的也是Windows版本的GCC了。
所以提前准备好VC 6.0③检验是否可以进⾏lex⽂件编译1.新建⽂本⽂件,更改名称为lex.l,敲⼊下⾯代码%{int yywrap(void);%}%%%%int yywrap(void){return 1;}2.新建⽂本⽂件,更改名称为yacc.y,敲⼊下⾯代码%{void yyerror(const char *s);%}%%program:;%%void yyerror(const char *s){}int main(){yyparse();}我们暂且不讨论上⾯代码的意思。
打开控制台,进⼊到刚才所建⽴⽂件(lex.l,yacc.y)所在的⽂件夹。
Lex和Yacc在软PLC开发系统中的应用

asna n l e wi e e f ac( e a ohr o ir o ir id c se e ae. hnP C y t a a zr t t l o Y c Y t n te c mp e —c mpe) i u sdi t p r T e L x y hhhp l l s s n h p
中 图 分 类 号 :P 7 T23 文 献标 识码 : A
Ap l a i n o x a d Ya c i o t p i t fLe n c n S fPLC g De eo m e tS se c o v l p n y tm
L h a g,W ANG n —ha g,MA o g b IS u n Yo g z n Xi n — o
p o r m’ c mpl g i su i i t . w o a tm aia y d v lp a tk n a a z rwi e h l fL x a d r g a S o i s t d e f s y Ho t u o t l e eo o e n l e t t ep o e n i n d r l c y h h
维普资讯
・
控 制 与检 测 ・
组 床与自 化 合机 动 加工技 术
文 章 编 号 :0 1— 2 5 20 )9— 0 0— 5 10 2 6 (0 6 0 0 3 0
Lx Y c 在软 P C开发 系统中 的应 用 e 和 ac L
lex和Yacc详解

Lex和Y acc工具介绍――编译原理的实用工具1.词法分词器生成工具lexLex的主要功能是生成一个词法分析器(scanner)的C源码。
描述词法分析器的文件,经过lex编译后,生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器。
词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容被后续阶段处理。
过程如错误!未找到引用源。
图1现在这个lex 文件可以用来生成一个统计行数、字符个数和单词个数的工具。
规则段是由正则表达式和相应的动作组成的。
p 1 {action 1}p 2 {action 2}……p n {action n }值得注意的是,lex 依次尝试每一个规则,尽可能地匹配最长的输入流。
如果有一些内容根可以看出lex的确按照最长的规则匹配。
程序段部分放一些扫描器的其它模块,比如一些动作执行时需要的模块。
也可以在另一个程序文件中编写,最后再链接到一起。
生成C代码后,需用C的编译器编译。
连接时需要指定链接库。
gcc的连接参数为 -ll。
2.正则表达式正则表达式可以描述有穷状态自动机(Finite Automata)接受的语言,也就是定义一个可以接受的串的集合。
转义字符(也称操作符):" \ [ ] ^ - ? . * + | ( ) $ / { } % < >这些符号有特殊含义,不能用来匹配自身。
如果需要匹配的话,可以通过引号(’’)或者转义符号(\)来指示。
比如C”++”C\+\+都可以匹配C++。
非转义字符:所有除了转义字符之外的字符都是非转义字符。
一个非转义字符可以匹配自身。
比如integer匹配文本中出现的integer。
通配符:通配符就是”.”(dot),可以匹配任何一个字符。
字符集:用一对[]指定的字符构成一个字符集。
比如[abc]表示一个字符集,可以匹配a、b、c中的任意一个字符。
使用–可以指定范围。
应用Lex与Yacc实现设备描述分析

于 17 9 5年研制开发的一个编译程 序 , 能够 自动生成词
法分析程序和语 法分 析程序 的工具 。
1 1 L x和 Y c . e a c的 基 本 原 理
1 11 L x . . e
信接 口对 H R A T智能仪表进行配置 。每个厂家生产不 同类 型的仪 表 , 种 型号 的仪 表 都具 有不 同的特性 。 各
0 引 言
H R A T现 场 总 线 协 议 被 广 泛 地 应 用 于 压 力 、 度 温
1 基本 原理
Lx和 Y c e ac是美 国 贝 尔实 验 室 的 L s ek和 Jh sn ono
和流量等智能仪表之 中。仪表在实际应用前要进行 配
置 , 态 软 件 可 以在 台 式 电 脑 或 者 掌 上 电脑 上 通 过 通 组
实现 分析设 备 描述 , 立多 种设 备的运 行数 据 , H R 建 使 A T现 场总线 协议 的组 态软 件 能够 配置 多 种设 备 。讨 论 了 Lx和 Y c e ac的词法 分 析 和语 法 分析技 术及设 备 描述语 言 , 功开 发 了能够分 析 H R 协 议设 备描 述 的组态 软件 , 成 AT 实现 了 H R A T设备 的互 操作 。
关键 词 :设 备描 述 H R A T协议 变送 器 文献 标志码 :B
中 图分类号 :T 2 6+ 1 P1 .
Ab ta t:Th e ie d s rpin o xen lc aa trsiso sr c e d vc ec t fe tra h r ce t fHART ed e uime th lste h s o ue p r t l kn so ed e i— i o i c i f l q p n ep h o tc mp tro e aeal i d ff l q p i u me t I r e o i lme titr p r bl yo h o tc mp tr。b sn e iae o l fL xa d Ya c。a ayi fd vc e c pin a d n . n od rt mp e n ne o ea it fteh s o ue i y u igd dc td toso e n c n lsso e ied s r to i n etb ih n fo eain aao h q ime taei lme td.r1 s a o e ie a ec n g r d b o g rto ot r eb s d o sa ls me to p rt a d t f ee up n r mpe ne ol t I u 。v r usd vc sc n b o f u e yc n u ain s f 1 i i i f wa a e n HART rtc 1 T e tc n lge flxc la ay i d s na n yi fL x a d Ya c a l a e ie d srp in ln u g r ic se p oo o. h e h oo iso e ia n ssa y tx a a sso e c swels d vc e c to a g a e ae ds u s d。 l n l n i tec n g r to f r eta s n lz h o i f u ain s t o wa t na ay eHART d vc ec pin i de eo d s c esul h eitrpea it fHART d vc si lme ・ h c e ie d s r t s v lp u c sfly,t ne o r bl yo i o e i e iei mp e n td. e K e wo d y r s: De ie d s rpin vc ec to i HART rtc l T a s t r po o o rn mit e
LEX和YACC的使用(例子)

LEX和YACC的使⽤(例⼦)1、简单C语⾔的词法分析程序;%{#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>%}digit [0-9]letter [A-Za-z]other_char [!-@\[-~]id ({letter}|[_])({letter}|{digit}|[_])*string {({letter}|{digit}|{other_char})+}int_num {digit}+%%[ |\t|\n]+ "auto"|"double"|"int"|"struct"|"break"|"else"|"long"|"switch"|"case"|"enum"|"register"|"typedef"|"char"|"extern"|"return"|"union"|"const"|"float"|"short"|"unsigned"|"continue"|"for"|"signed"|"void"|"default"|"go \"([!-~])*\" {printf("CONST_string,%s\n",yytext);}-?{int_num}[.]{int_num}?([E][+|-]?{int_num})? {printf("CONST_real,%s\n",yytext);}"0x"?{int_num} {printf("CONST_int,%s\n",yytext);}","|";"|"("|")"|"{"|"}"|"["|"]"|"->"|"."|"!"|"~"|"++"|"--"|"*"|"&"|"sizeof"|"/"|"%"|"+"|"-"|">"|"<"|">="|"<="|"=="|"!="|"&"|"^"|"|"|"&"|"||"|"+="|"-="|"*="|"/="|"%="|">>="|"<<="|"&="|"^="|"|="|"=" {printf("%s,NULL\n",yytext);}{id} {printf("ID,%s\n",yytext);}{digit}({letter})+ {printf("error1:%s\n",yytext);}%%#include <ctype.h>Upper(char *s,int l){int i;for(i=0;i<l;i++){s[i]=toupper(s[i]);}}yywrap(){return 1;}注意:要得到输出信息,需要⾃⾏添加main函数,lex默认的main函数没有输出的。
Lex与Yacc学习(七)之环境配置另一种方式
Lex与Yacc学习(七)之环境配置另⼀种⽅式必备⼯具flex与bison安装运⾏flex-2.5.4a-1.exe 和 bison-2.4.1-setup.exe ⽂件安装⾄D:\Software Files\GnuWin32下,然后按配置环境变量:将路径 D:\Software Files\GnuWin32\bin 复制于Path中。
Cygin安装配置运⾏cyg_win_setup.exe⽂件安装⾄D:\cygwin下,然后配置环境变量:将路径D:\cygwin\bin复制于Path中;注意:在D:\cygwin\bin⽂件夹下,有g++.exe ⼤⼩为1KB 与g++ 3.exe ⼤⼩为95KB ,我们需要把95KB的 g++ 3.exe命名为 g++.exe ,1 KB的g++可删除,或者命名为g++3.exe;同理,有gcc.exe ⼤⼩为1KB 与gcc 3.exe ⼤⼩为95KB ,我们需要把95KB的 gcc 3.exe命名为 gcc.exe ,1 KB的gcc可删除,或者命名为gcc 3.exe 。
必要⽂件复制我们发现D:\cygwin\bin下⾯并没有flex.exe 与bison.exe,因此,(1)将安装好的D:\Software Files\GnuWin32\bin下的flex.exe 与bison.exe复制到D:\cygwin\bin下⾯;(2)再将D:\Software Files\GnuWin32的share⽂件夹复制到D:\cygwin下⾯;(3)将D:\Software Files\GnuWin32\lib下的libfl.a 和 liby.a 复制到D:\cygwin\lib下⾯;检测配置是否成功打开D:\cygwin下的Cygwin.bat 或者系统的cmd,按照以下⽅式检验:环境搭建结束!。
编译原理 lex和yacc的综合设计 python
编译原理lex和yacc的综合设计python
1、Lex和Yacc是一种强大的词法分析和语法分析技术,它们常用于编译器的开发和编写编译器前端。
它们分别可以分析和解释输入字符流,并产生相应的输出。
Lex是一个词法分析器,它可以将输入字符流分解为令牌(即识别的节点),这些令牌可以用于编写解释器或编译器的前端。
Yacc则是一种用来构建语法分析器的工具,它可以识别输入的令牌序列,并生成相应的程序。
2、编译原理是编译器的最小系统,它涉及源程序的分析和分解,目标程序的生成和优化,以及中间代码的翻译。
Lex和Yacc则是用来处理字符流和语法检查的两个有力工具,在处理中间代码生成和优化方面非常有用,是编译器的核心部分。
3、Lex和Yacc的综合设计一般需要借助某种语言将可执行模块链接起来,最常用的技术是使用C,C是一种高性能语言,可以让开发者实现快速迭代,也可以利用其标准库实现代码复用,因此是完成Lex和Yacc综合设计的最佳语言。
4、Python是一种脚本语言,不适合用于编写Lex和Yacc综合设计,因为Python 并不专业,不能满足低级程序设计的需求,处理过程中往往性能不佳。
LEX和YACC入门
LEX 将这些规则翻译为词法分析器。每一个规则依次包含一 个正则表达式以及该正则表达式得到匹配时要运行的一些代 码。
任何没有得到匹配的文本则简单地拷贝到标准输出。
2020/5/13
6
三、LEX程序设计
LEX正规表达式(1)
expression: value '+' value { System.out.println("Matched a '+' expression.\n"); }
2020/5/13
23
四、YACC程序设计
类似于 LEX, YACC 也有 一套变量和函数可供用户 来进行功能扩展。
YYSTYPE 定义了用来将 值从 lexer 拷贝到解析器 或者 YACC 的 yylval ( 另一个 YACC 变量)的 类型。默认的类型是 int 。 由于字符串可以从
的值。
2020/5/13
26
四、LEX与YACC结合
2020/5/13
27
public static void main(String args[]) {
int n = 1;
mylexer lexer = new mylexer();
if (lexer.yycreate(null)) {
n = lexer.yylex();
}
System.out.println("word count = "+lexer.wordCount);
两个百分号标记指出了 LEX程序中这一段的结束和三段中第二段 的开始。
10
基于LEX&YACC数控代码编译技术研究
co e c d om pie, usng s e ilc l i p ca om p l 0 l— — LEX & YACC , NC o o pl e hnoogy an t s r a iaton i t i d e pl ie t 0 s c de c m ie t c l d i ’ e lz i ss ud e d e y, N C o om pi y t m — — N CCo pie 1. i v l e uc e suly、 Com pa e t h r dii c de c l e se m l r 0 sde eop d s c s f l r o t e ta tona NC od om p l ysem , t e l c ec ie s t h c m p l fe toft e s s em i m p o ed o ie e f c h y t s i r v m a k dl r e y.
维普资讯
基于 L X&YACC数 控 代 码 编 译 技 术 研 究 * E
沙 智 华 葛研 军 施 志 辉 赵 亮
大 连 铁 道 学 院 机 械 工 程 系 , 宁 大 连 1 6 2 辽 10 8
摘 要 : 控 程 序 编 译 水 平 及 效 率 是 影 响 数 控 加 工 效 率 的 一 项 重 要 因 素 。 针 对 高 级 语 言 开 发 数 控 代 码 编 数 译 系 统 的 局 限 性 , 文 把 编 译 技 术 引 入 到 数 控 代 码 编 译 中 , 用 专 用 编 译 工 具 LEX & YACC, 数 控 代 本 应 对 码 编 译 技 术 及 其 实 现 过 程 进 行 了 深 入 研 究 , 功 开 发 了 数 控 代 码 编 译 系 统 — — NCC mp lr 0, 系 统 成 o i l、 该 e
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手动生成的 编译程序(.C) 源程序(.C) 目标程序(.obj)
手动生成编译程序的缺点:工作量太大,维护 : , 困难 如:ANSI C的词法规则有近100条,相应的状态 NFA有600多,DFA有200多
3
利用LEX自动生成编译程序
LEX LEX源程序 源程序 (扩展名 扩展名.l) 扩展名 自动生成的 编译程序 lex.yy.c
19
条件模式
控制某些模式在一定状态下使用的功能,称 为条件模式 例:如希望对输入文件中出现的单词world 做如下处理,如所在行首字母为a,则换为 first,为b换为second,否则原样输出
20
不用条件模式的程序 int flag; %% ^a {flag='a';ECHO;} ^b {flag='b';ECHO;} \n {flag=0;ECHO} world {switch(flag) {case 'a': printf("first");break; case 'b': printf("second");break; default: ECHO;break;}} %%
缺省规则:无模式可匹配时,原样拷贝至 yyout. 最短的lex源程序 %%
17
12.5 动作部分
匹配后不做动作:吃掉此串 %% "hello world" 再如 %% [\t]+ putchar(' ');
18
| 的用法 %% world | water printf("Same action"); 一些重要函数、变量和宏 int yywrap(); yyin;yyout;yytext; REJECT;ECHO
39
12.8 YACC源文件的格式
YACC源文件由三个部分组成 定义部分 %% 规则部分 %% 用户附加C语言代码部分 YACC不象LEX对源文件格式有严格要求,任 何YACC指令均可以非顶行的形式来书写
40
12.8.1 单词和非终结符
YACC中的规则是BNF范式. YACC最欢迎的是左递归文法,这样的分 析器是归约优于移进.YACC栈的长度只有 600左右 YACC内BNF范式中出现的单词分有名单 词(有单独种别码的单词)和无名单词(字符 本身的ASCII码作种别码) 有名单词的种别码在定义部分以 %token的形式给出.例:%token NUM
23
例二:汉字GB码在文本文件中用两个最高 位是1的字节表示,试利用lex设计一程序, 统计一个文本文件中的汉字数。 例三:实验一的词法分析器如何用lex来实 现?
24
%{ "stdio. #include "stdio.h" "stdlib. #include "stdlib.h" int num_num=0,num_id=0; num_num=0,num_id=0 %} +]?[1 ][0 INTEGER [-+]?[1-9][0-9]* [a-zA-Z][a-zA-Z_0 ID [a-zA-Z][a-zA-Z_0-9]* [ \n\t] SPACE
15
12.4 yylex()的匹配原则
最长匹配原则 最前匹配原则 %% world printf("hello world"); water printf("I need water"); [a-z][a-z0-9] printf("Identifier"); %% 设输入子串为worldwar
16
29
上例运行步骤: 在dos提示符下运行 flex b.l,此时可生成 一lexyy~1.c的C程序. 在C集成环境下(Bc3.1 或Tb2.0)按F9编 译此程序,可得可执行文件lexyy~1.exe 运行lexyy~1.exe,可得结果 count=10
30
12.7 YACC 简介
YACC (Yet Another Compiler Compiler) 其它编译器的编译器 YACC源于UNIX计划,1972由Bell实验室的 S.C.Johnson编制完成 Berkeley大学开发了和YACC完全兼容的 BYACC GUN推出了和YACC完全兼容的Bison。 成功范例:GNU C 和 P2C
LEX 和 YACC
LEX (Lexical Anaபைடு நூலகம்yzar)
YACC (Yet Another Compiler Compiler) BISON FLEX(Fast Lexical Analyzer Generator) GNU(Gnu's Not Unix )
1
12.1 LEX简介
单词:字符串集上的一个分类称为单词(Token) 模式:单词的描述称为模式(Lexical Pattern). 例:[0-9][0-9]* 单词的成员称为词形(Lexeme) 例:1236573
4
例:一个LEX源程序(统计文本文件行数和字符数) TEST.L
int num_chars=0,num_lines=0; %% \n {++num_chars;++num_lines;}//一定要 一定要 顶行写 . ++num_chars; %% main() { yylex(); printf("the line is %d,the char is %d",num_lines,num_chars);} int yywrap() {return 1;} 5
31
YACC 工作原理
YACC YACC源程序 源程序 (扩展名 扩展名.y) 扩展名 Y.TAB.H Y.TAB.C (YTAB~1.H ,YTAB~1.C)
32
思考?
现要完成一计算器。计算器的BNF如下 <input>→ ε|<input><line> <line> →'\n' |<exp>'\n' <exp>→NUM | <exp>+<exp> |<exp><exp> |<exp>*<exp> |<exp>/<exp> |<exp>^<exp> |<exp>|(<exp>)
25
%% {INTEGER} {num_num++;ECHO;} } {ID} {num_id++;ECHO;} SPACE | . {} %% main() {yylex();printf("num_num=%d,num_i d=%d");} int yywrap() {return 1;}
26
由C语言代码、模式--动作对组成(顶行书 写) 例: \n { ++num_chars;++num_lines; }
13
12.2.4 用户代码部分
此处代码将被原样拷贝至文件lex.yy.c的尾 部 用户代码部分是可省的
14
12.3 LEX的工作原理
LEX通过扫描源文件(*.l),将规则部分的正 规式转成DFA。 利用此DFA生成一个名为int yylex()的词法 分析函数,并将之拷贝至lex.yy.c中 lex.yy.c基本是不可读的
例二参考答案
设待分析的文件为zp.txt.要求判断zp.txt中 的汉字数,并打印汉字数.对非汉字不显示 zp.txt内容如下 这是一个abc试验程序 答案def
27
不妨设LEX源程序名为b.l,内容如下 %{ #include <stdio.h> #include <stdlib.h> int count=0; %} %% [\x80-\xff][\x80-\xff] count++;ECHO; .| \n
37
上例中词法分析器zpcal.l如下 %{ #include "zpcalt~1.h" extern YYSTYPE yylval; %} %%
38
[1-9][0-9]* {yylval=atoi(yytext);return NUM;} []| \t {} <<EOF>> return(0); \n | . {return yytext[0];} %% int yywrap() {return 1;}
10
12.2.2 定义部分
由C代码、模式的宏定义、条件模式的开始 说明等组成 C代码由顶行的%{和}%或不顶行的文字 定义 宏定义要顶行写
11
例: %{ int num_chars,num_lines; }% DIGIT [0-9] ID [a-z][a-z0-9]*
12
12.2.3 规则部分
例一:编制LEX源程序, 例一:编制LEX源程序,分别统计文本文件 LEX源程序 a.txt中出现的标识符和整数个数 并显示之。 中出现的标识符和整数个数, a.txt中出现的标识符和整数个数,并显示之。 标识符定义为字母开头,后跟若干个字母, 标识符定义为字母开头,后跟若干个字母, 数字或下划线。整数可以带+ 数字或下划线。整数可以带+或-号,也可不 且不以0开头。 带,且不以0开头。非单词和非整数则忽略 不记,将之滤掉不显示。 不记,将之滤掉不显示。
解 释 匹配x 匹配除换行符外的字符 其中之一 x-y之间的字符 除x-y之间的字符 闭包 正闭包 0或1次 2到5次 x或y 行首的x 行尾的x 文件结束标志 \x2a
例 子 a . [abcdefg] [a-g] [^a-g] a* a+ a? a{2,5} a|b ^a a$