正则表达式
引:
上述语言为:以字母a开头,然后连接一个任意长度的ab字符串,接下来若连接空串则表示该句子已经结束;若接下来连接的不是空串则可以连接点( . )或者下划线(_)再连接一个长度大于等于1的ab字符串。
正则表达式(Regular Expression, RE)是一种用来描述正则语言的更紧凑的表示方式,如:
定义
是一个RE,
- 如果
,则a 也是一个RE,
- 若r和s都是RE,其表示的语言为
和
,则有:
-
也是一个RE,
-
也是一个RE,
-
也是一个RE,
-
也是一个RE,
- 运算的优先级为 1、( * ) 2、(连接) 3、( | )
可以用正则表达式定义的语言叫做正则语言(regular language)或正则集合(regular set)
正则表达式遵循代数定律

正则定义(给RE起名)
C语言标识符例 :
即标识符:a231, _233, abs4_, ...
有穷自动机(Finit Automata, FA)
FA的表示:转换图
- FA的状态用节点,即圆圈表示。
- 初始状态 ( 开始状态 ):只有一个,用 start 表示。
- 终止状态 ( 接受状态 ):可以有多个,用双圈表示。
- FA的输入用带标记的有向边表示。
图1
FA定义(接收)的语言:
输入的串可以使FA从初始状态转换到某个终止状态(因为终止状态可以有多个),这样的串就是被该FA接收了。引用上图1举例:
设输入串为:abbaabb
则从左至右依次看输入串,输入a时依然是0态,再输入b也是0态,再输入b又是0态,然后是a也是0态,接着的a是1态(因为由图1来看,两个连续输入为a才会由0进入1态),然后的b和b依次进入2和3态,其中3是终止状态,在这个串中,使得有穷状态机从初始装态转换到了终止状态,就称该串被该FA接收了
当然这样的串不止一个,而所有满足接收条件的串的集合称为是该FA定义(或接收)的语言,记为
FA的模型:
- 输入带(input tape):用来存放输入字符串
- 读头(head):从左向右依次读取符号,且只读,不可往返
- 有穷控制器(finit control):其中有有穷个状态数,依据当前输入的符号(读头指向)和当前状态来控制是否转入下一状态

一个典型例子:电梯控制,它是如何通过有穷自动机实现的?(未明白待解决)
最长子串匹配原则(Longest String Matching Principle )
当输入串的多个前缀与一个或多个模式相匹配,总是选择最长的前缀进行匹配(自己的理解,当有穷自动机中有多个终止状态,而一个串刚好满足多个终止状态,则与距离start最长的终止状态来匹配)。如:

当输入的串为 1<=2 时,会匹配<=,而不是<。如何用程序实现呢? (暂)