正则表达式基础与学习01----来自《编译原理与实践》

常见Cron表达式&表达式生成器 文章目录前言一、在线Cron表达式生成器二、常用表达式三、Cron表达式规则1️⃣表达式含义 前言 提示:这是个人学习备忘录 一、在线Cron表达式生成器 在线Cron表达式生成器 二、常用表达式 每天的7点、11点、17点都执行一次: 0 0 7,11,17 * * ? 每隔5秒执行一次: */5 * * * * ? 每隔1分钟执行一次: 0 */1 * * * ? ? 每天23点执行一次: 0 0 23 * * ? 每天凌晨1点执行一次: 0 0 1 * * ? 阅读详情

        正则表达式表示字符串的格式。正则表达式r完全由它所匹配的串集来定义。这个集合称
为由正则表达式生成的语言( language generated by the regular expression),写作L(r)。此处
的语言只表示“串的集合”,它与程序设计语言并无特殊关系(至少在此处是这样的)。该语言
首先依赖于适用的字符集,它一般是A S C I I字符的集合或它的某个子集。有时该集比A S C I I字
符的集合更普通一些,此处集合的元素称作符号( s y m b o l)。这个正规符号的集合称作字母表
(a l p h a b e t)并且常写作希腊符号å(s i g m a)。
正则表达式r还包括字母表中的字符,但这些字符具有不同的含义:在正则表达式中,所
有的符号指的都是模式。在本章中,所有模式都是用黑体写出以与作为模式的字符区分开来。
因此,a 就是一个作为模式的字符a。
最后,正则表达式r还可包括有特殊含义的字符。这样的字符称作元字符( m e t a c h a r a c t e r)
或元符号(m e t a s y m b o l)。它们并不是字母表中的正规字符,否则当其作为元字符时就与作为
字母表中的字符时很难区分了。但是通常不可能要求这种排斥,而且也必须使用一个惯例来区
分元字符的这两种用途。在很多情况下,它是通过使用可“关掉”元字符的特殊意义的转义字
符(escape character)做到的。源代码层一般是反斜杠和引号。如果转义字符是字母表中的正
规字符,则请注意它们本身也就是元字符了。

 

正则表达式的定义


        现在通过讲解每个模式所生成的不同语言来描述正则表达式的含义。首先讲一下基本正则
表达式的集合(它是由单个符号组成),之后再描述从已有的正则表达式生成一个新的正则表达
式的运算。它同构造算术表达式的方法类似:基本的算术表达式是由数字组成,如4 3和2 . 5。算
术运算的加法和乘法等可用来从已有的表达式中产生新的表达式,如在43 * 2.5和43 * 2.5 + 1.4
中。
        从它们只包括了最基本的运算和元符号这一方面而言,这里所讲到的一组正则表达式都是
最小的,以后还会讲得更深一些。
        1) 基本正则表达式它们是字母表中的单个字符且自身匹配。假设a是字母表å中的任一字
符,则指定正则表达式a 通过书写L (a) = {a}来匹配a字符。而特殊情况还要用到另外两个字符。
有时需要指出空串( empty string)的匹配,空串就是不包含任何字符的串。空串用( e p s i l o n )
来表示,元符号(黑体)是通过设定L( ) = { }来定义的。偶尔还需要写出一个与任何串都
不匹配的符号,它的语言为空集(empty set),写作{ }。我们用符号来表示,并写作L( ) = {}。
请注意{ }和{ }的区别:{ }集不包括任何串,而{ }则包含一个没有任何字符的串。
        2) 正则表达式运算在正则表达式中有3种基本运算:① 从各选择对象中选择,用元字符|
(竖线)表示。②连结,由并置表示(不用元字符)。③重复或“闭包”,由元字符*表示。后面
通过为匹配了的串的语言提供相应的集合结构依次讨论以上3种基本运算。
        3) 从各选择对象中选择如果r 和s 是正则表达式,那么正则表达式r | s 可匹配被r 或s 匹
配的任意串。从语言方面来看,r | s 语言是r 语言和s 语言的联合(u n i o n),或L (r | s) = L (r)
ÈL (s)。以下是一个简单例子:正则表达式a | b匹配了a 或b 中的任一字符,即L (a | b) = L (a)
ÈL (b) = {a}È{b} = {a, b}。又例如表达式a | 匹配单个字符a 或空串(不包括任何字符),也
就是L (a | ) = {a, }。
        还可在多个选择对象中选择,因此L (a | b | c | d) = { a, b, c, d} 也成立。有时还用点号表示
选择的一个长序列,如a | b |...| z,它表示匹配a~z 的任何小写字母。
        4) 连结正则表达式r 和正则表达式s 的连结可写作r s,它匹配两串连结的任何一个串,其
中第1个匹配r,第2个匹配s。例如:正则表达式a b只匹配a b,而正则表达式( a | b ) c 则匹配
串ac 和b c(下面将简要介绍括号在这个正则表达式中作为元字符的作用)。
       可通过由定义串的两个集合的连结所生成的语言来讲解连结的功能。假设有串S1 和S2 的两
个集合,串S1S2 的连结集合是将串S2 完全附加到串S1 上的集合。例如若S1 = {aa, b}, S2 = {a, bb},
则S1S2 = { aaa, aabb, ba, bbb}。现在可将正则表达式的连结运算定义如下:L (r s) = L (r) L (s),
因此(利用前面的示例),L (( a | b ) c) = L ( a | b ) L (c) = {a, b} {c} = {ac, bc}。
连结还可扩展到两个以上的正则表达式:L (r1r2 ... rn ) = L (r1 ) L (r2 ) ... L (rn ) = 由将每一个
L (r1 ), ..., L (rn ) 串连结而成的串集合。
       5) 重复正则表达式的重复有时称为K l e e n e闭包((Kleene) closure),写作r *,其中r 是一
个正则表达式。正则表达式r * 匹配串的任意有穷连结,每个连结均匹配r。例如a *匹配串、a、
a a、a aa . . .(它与匹配是因为是与a匹配的非串连结)。通过为串集合定义一个相似运算*,
就可用生成的语言定义重复运算了。假设有一个串的集合S,则
S* = { } È S È SS È SSS È. . .
这是一个无穷集的联合,但是其中的每一个元素都是S中串的有穷连结。有时集合S*可写作:
其中Sn = S . . . S,它是S 的n 次连结(S0 = { })。
现在可如下定义正则表达式的重复运算:
L (r*) = L (r) *
例:在正则表达式(a | b b) * (括号作为元字符的原因将在后面解释)中,该正则表达式与以
下串任意匹配: 、a、b b、a a、a b b、b b a、b b b b、a a a、aabb 等等。在语言方面,L (( a | b b ) *)
= L (a | b b)* = {a, bb}* = { , a, b b, a a, a b b, b b a, b b b b, a a a, a a b b, a b b a, a b b b b, b b a a, . . . }。
        6) 运算的优先和括号的使用前面的内容忽略了选择、连结和重复运算的优先问题。例如
对于正则表达式a | b *,是将它解释为( a | b )* 还是a | ( b* ) 呢(这里有一个很大的差别,因
为L (( a | b )*) = { , a, b, aa, ab, ba, bb, . . . },但L ( a | ( b* )) = { , a, b, bb, bbb, . . . } )?标准
惯例是重复的优先权较高,所以第2个解释是正确的。实际上,在这3个运算中, *优先权最
高,连结其次,| 最末。因此,a | b c * 就可解释为a | ( b ( c* )),而a b | c * d 却解释为( a b )
| (( c* ) d )。
       当需指出与上述不同的优先顺序时,就必须使用括号。这就是为什么用( a | b ) c 能表示
选择比连结有更高的优先权的原因。而a | b c 则被解释为与a 或bc 匹配。类似地,没有括号的
( a | b b )* 应解释为a | b b*,它匹配a、b、b b、b b b. . . 。此处括号的用法与其在算术中类似:
(3 + 4) * 5 =35,而3 + 4 * 5 = 23,这是因为* 的优先权比+ 的高。
       7) 正则表达式的名字为较长的正则表达式提供一个简化了的名字很有用处,这样就不再
需要在每次使用正则表达式时书写长长的表达式本身了。例如:如要为一个或多个数字序列写
一个正则表达式,则可写作:
( 0 | 1 | 2 | . . . | 9 ) ( 0 | 1 | 2 | . . . | 9 ) *
或写作
digit digit*
其中
digit = 0|1|2|...|9
就是名字d i g i t的正则定义(regular definition)了。
正则定义的使用带来了巨大的方便,但是它却增加了复杂性,它的名字本身也变成一个元
符号,而且必须要找到一个方法能将这个名字与它的字符连结相区分开。在我们的例子中是用
斜体来表示它的名字。请注意,在名字的定义中不能使用名字(也就是递归地)——必须能够
用它代表的正则表达式替换它们。
在考虑用一些例子来详细描述正则表达式的定义之前,先将有关正则表达式定义的所有信
息收集在一起。

定义 正则表达式(regular expression)是以下的一种:
        1. 基本(b a s i c)正则表达式由一个单字符a(其中a 在正规字符的字母表å中),以及
元字符或元字符组成。在第1种情况下,L (a) = {a};在第2种情况下,L ( ) =
{ };在第3种情况下,L ( ) = {}。
        2. r | s 格式的表达式:其中r 和s 均是正则表达式。在这种情况下,L (r | s) = L (r) È L (s)。
        3. rs 格式的表达式:其中r 和s 是正则表达式。在这种情况下,L (r s) = L (r) L (s)。
        4. r* 格式的表达式:其中r 是正则表达式。在这种情况下,L (r*) = L (r) *。
        5. (r)格式的表达式:其中r 是正则表达式。在这种情况下,L ( (r)) = L (r),因此,括
号并不改变语言,它们只调整运算的优先权。
        我们注意到在上面这个定义中,(2)、(3)和(4)的优先权与它们所列的顺序相反,也就

是:|的优先权最低,连结次之,* 则最高。另外还注意到在这个定义中, 6个符号—— 、、
|、*、( 和) 都有了元字符的含义。

编译原理之正则表达式转NFA 前言:继上次的《自己写一个简单的C++单词扫描程序》之后,编译原理实验课要求做一个Regural Express 转NFA图,这个在算法上没什么难度,在《编译原理与实践》书上介绍了Thompson的转换算法,该书对Thompson算法做了详细的文字描叙,如想对该算法更深的了解参照:机械工业出版社,《编译原理与实践》译本P.45。正文:一、问题分析: 要求输入一个正则表达式,将其转换为N 阅读详情

相关推荐

编译原理-文法的定义与分类

编译原理-文法的定义与分类前言一、文法的定义二、文法的分类0.短语结构语言(PSL)1.上下文有关文法(CSG)2.上下文无关文法(CFG)3.正规文法(RG)三、判断以下文法的类别 前言 语言是一定的群体用来信息交流的工具 ,而信息交流的基础是需要按照共同约定的生成规则和理解规则去生成句子和理解句子。计算机的语言具有严格的语法、语义,易于形式化的特征。程序设计语言经过形式化提取后可以得到以下内容: 程序设计语言(Programming Language):组成程序的所有语句的集合。 程序(Progra.

weixin_43824348的博客 6828

cron表达式含义

  0/50:表示从0分开始,每隔50分钟执行一次

qq_16214677的博客 1070

编译原理程门立雪再回首时雪拥蓝关

标题1(30分)证明3.3.1中,关系交换律、结合律等五个关系1、U | V=V | U2、U |(V | W)=(U | V) |W3、U(VW)=(UV)W4、U(V | W)=UV | UW5、U=U=U 1(30分)证明3.3.1中,关系交换律、结合律等五个关系1、U | V=V | U2、U |(V | W)=(U | V) |W3、U(VW)=(UV)W4、U(V | W)=UV | ...

flowerzhou39的博客 2010

cron表达式详解

cron表达式详解

weixin_47584432的博客 2050

大学课程 编译原理 知识点总结 期末复习用

基于教材《计算机编译原理》张幸儿 编著

2301_78352529的博客 1458

2024新版计算机编译原理期末速成全套视频教程(视频+配套资料)

很多小伙伴希望我们能够推出一些计算机基础类的课程。帮助大家能够快速入门计算机专业,了解计算机底层工作原理。因为很多跨专业学习计算机编程的同学,都需要先掌握计算机基础知识。比如有这么一个基本问题:用高级语言编写的程序是怎样变成能在计算机上执行的机器语言程序的?要想解答这个问题,就需要我们掌握编译原理这门课。这次,博主甄选出了各高校选用的编译原理教材——陈意云教授的编译原理(第三版),并和陈意云老师对录制内容做了相关的沟通。同时也参考了中国大学 MOOC 精品课程哈工大陈鄞教授对编译原理的解读。

码农王也的博客 1038

吉林大学软件学院编译原理与实现习题(一) 期末复习用

一.单选题 1.符号串集合A= { a,b,c,d,…,z,A,B,C,D,…,Z },下面对集合说法正确的是: A、该集合是英文字母集合 B、该集合中符号串长度都等于n C、该集合是英文串集合 D、该集合中符号串长度都小于等于n 正确答案: B 2.r=(a|b|c)(x|y|z),则L(r)中元素个数是: A、9 B、6 C、18 D、27 正确答案: A 3....

qq_41349068的博客 4940

吉林大学编译原理课程设计与实验解析

编译器是一个复杂的软件系统,负责将高级语言编写的源代码转换成机器语言编写的可执行程序。它涉及到了一系列的处理过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。语义分析是编译过程中的一个关键步骤,它的目的是检查程序中是否存在违反编程语言语义规则的情况。在SNL语言的语义分析阶段,编译器需要确保程序的每个部分都有明确的含义,符合语言定义的语义约束。语义规则通常包括:类型检查:确保表达式中的操作数类型一致,并且符合操作符的要求。作用域规则。

weixin_42502089的博客 1079

cron表达式

一个cron表达式是由6到7个域组成,并且以空格隔开的字段串。cron原来是UNIX的工具之一,主要用于进行任务调度,cron的核心应用就是使用cron表达式来处理任务调度。以下为一个简单的cron表达式:10 * * * * ?,表示每分钟的第10秒将会触发。 一个完整的cron表达式总共有7个域(以空格隔开),从左到右分别表示秒、分、小时、月份中的日期、月份、星期中的日期和年份,其中年份域为

萝卜地里的兔子的博客 5507

编译原理实验全攻略:课件+源码+简例实战

一个CFG由四个部分组成:( V ):非终结符集合(Variables),代表语法类别,如ExpressionStatement( T ):终结符集合(Terminals),也就是前面词法分析输出的Token类型( P ):产生式规则集合,形如A → α( S ):开始符号,通常是Program或Start举个简单的算术表达式文法:这里:E表示表达式(Expression)T表示项(Term)F表示因子(Factor)id。

weixin_35750747的博客 1150

让 AI 自己“画施工图”——基于扩散模型的智能 CAD 管线生成

AI驱动CAD管线设计革命:Layout2CAD实现30秒自动化出图 针对设计院70%时间耗费在管线绘制的问题,研究团队基于Stable Diffusion开发了Layout2CAD系统,实现建筑草图到DWG施工图的智能转换。该系统采用三阶段流程:语义分割建筑底图→扩散生成多通道Heatmap(含管径/标高信息)→矢量化输出DWG实体,结合129M参数的多模块模型(Diffusion UNet+GraphRefiner)及规范判别器,确保1mm精度并自动满足GB50015-2019标准。

qq_74383080的博客 2014

编译原理 - 学习/实践

编译技术,与我们的工作[很多编程语言的工作原理]息息相关, 同时,除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要.

"代码"的日常搬运 7668

在Keil下完成一个汇编程序的编写

在学习STM32的路上开始是学的C语言尚未进行对汇编进行学习,因此抽出时间来学习一下在keil下的汇编语言。

Liu-FE的博客 1万+

编译原理--正则文法与正则表达式

对任何正则文法G,存在定义同一语言的正则表达式r 对任何正则表达式r,存在生成同一语言的正则文法G 正则文法到正则表达式的转换 将正则文法中的每个非终结符表示成关于它的一个正则表达式方程,获得一个联立方程组 依照求解规则: 若x=αx∣βx=\alpha x | \betax=αx∣β(若x=αx+βx=\alpha x + \betax=αx+β),则解为:x=α∗βx=\alpha^*...

Meskjei的博客 2万+

MTK metadata中AF模块的移除与配置调整

本文详细介绍了在MTK平台Camera开发中如何移除metadata中的AF(自动对焦)模块。通过系统清理MTK_CONTROL_AF_REGIONS、MTK_CONTROL_MAX_REGIONS等关键配置项,并调整对焦模式及硬件特性声明,确保定制化设备在禁用自动对焦功能后的稳定运行。

q1w3e5r7t9y的博客 570

手把手教你配置SAP PP供应区域(Supply Area):实现线边仓精准发料与物料流优化

本文详细解析了SAP PP供应区域(Supply Area)的配置方法,帮助企业实现线边仓精准发料与物料流优化。通过三级优先级逻辑和四步配置法,系统可自动识别最优组件来源位置,显著提升生产订单处理效率和库存准确率。文章还提供了典型问题解决方案和性能优化技巧,适用于离散制造和重复制造场景。

weixin_29275257的博客 434

学习经验 | 编译原理第三版学习资料包

编译原理(第三版)》由张素琴、王生原、董渊等编著,由清华大学出版社出版,是计算机科学、软件工程及通信工程等专业的经典教材。作为一本理论与实践相结合的教材,它对于有意从事软件开发、系统设计等工作的学生,提供了坚实的理论基础和实践指导,是编译技术学习的必备参考书。内容包括编译器的基本功能、编译过程的阶段划分(词法、语法、语义分析等),以及编译器在语言处理系统中的作用。,需熟悉中间代码表示、流图与基本块的构建,优化方法如公共子表达式消除、代码移动、强度削弱等,以及目标代码生成中的指令选择和寄存器分配。

Baoyan_cs的博客 1195

批量读取_MCGS触摸屏如何实现批量读取modbus数据的方法?

前两天,在一个QQ群里,有同行的朋友问,在MCGS中如何实现批量读取数据,因为他当时面临设备,通讯协议才是MODBUS RTU,同时厂家说地址不能分开读,必须是连续的。鉴于他提供的消息是能够设置的地方都试过了。为此,我直接告诉通过脚本,批量读取的方案。那么这个方案究竟如何实现?且看我下面慢慢道来。一、工具1.modsim:仿真PLC或者第三方设备。2.MCGS组态软件3.串口软件:在电脑中生成两不...

weixin_32511509的博客 8160

正式学习编译原理之前的整理

正式学习编译原理之前的整理 如下有一个小目标 对于普通程序员,我认为编译原理这门课主要掌握几点就够用了: 词法分析方面,掌握正则表达式,了解dfa/nfa。 Parsing 方面,能读懂BNF,知道AST,会写简单的递归下降parser,会用antlr之类的parser generator。 优化方面,知道现代编译器的优化能力有多强,知道如何配合编译器写出高效易读的代码,避免试图outsmart编译器。 会实现简单的虚拟机(stack-based,不带GC),并把四则运算表达式翻译为虚拟机指令。 ——

C_Cater的博客 555

【项目立项管理、项目整合管理】30天通过软考高项-第二天

①项目或阶段的概述;②范围目标、范围的评估标准,证明达到完⼯标准的证据;③质量目标、项目和产品质量的评估标准、相关核实信息和实际里程碑交付日期以及偏差原因;④成本目标,包括可接受的成本区间、实际成本,产⽣任何偏差的原因等;⑤最终产品、服务或成果的确认信息的总结;⑥进度计划目标,包括成果是否实现项目预期效益:如果在项目结束时未能实现效益,则指出效益实现程度并预计未来实现情况;

weixin_42520723的博客 1000

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

相关性分析:求解相关系数并绘制热力图进行对比

weixin_67565775的博客 8万+

编译原理笔记01:词法分析

编译原理笔记01:概述&词法分析

2189

华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。

qq_45776114的博客 837

Java-正则表达式01

正则表达式,很实用,非常实用。能熟练掌握并使用对编程有很大帮助

程序员飞扬的博客 475

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

编译原理学习笔记

编译原理学习笔记

m0_49646372的博客 1783

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

编译原理龙书第四章部分习题(编译原理作业三)

编译原理作业3 所有题目均为自己所写,觉得有用可以点个赞哟:-) 答案仅供参考,若有问题欢迎评论区讨论~ 文章目录编译原理作业34.2.14.2.24.2.34.2.54.4.14.4.44.6.54.6.64.7.24.7.5 4.2.1 考虑上下文无关文法:S ->SS+|SS|a,以及串aa + a 。 (1)给出这个串的一个最左推导。 (2)给出这个串...

LoveMQ_919的博客 2万+
上一篇: C# B/S程序中使用DropDownList出现System.ArgumentOutOfRangeException: “DropDownList1”有一个无效 SelectedValue,因为它不在项目列表中的解决方法
下一篇: 正则表达式基础与学习02----来自《编译原理与实践》
lujunql
博客等级 码龄19年 156粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lujunql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值