`

你知道正则表达式的形式化定义吗?

    博客分类:
  • Misc
阅读更多

正则表达式想必大家都用过,确实是很好很强大的东东。但是正则表达式的形式化定义各位知道吗?最近无聊看一本编译方面的书时,里面正好讲到了这个,还是挺有意思的。发出来和大家分享。

 

首先,正则表达式是一种符号表示法,是为了用有限的描述来详细说明(可能)无限的语言。也就是说正则表达式是针对某个特定语言的,可以说每个正则表达式都定义了一种语言。每个正则表达式代表一个字符集。在正则表达式中,需要定义如下几个概念:

  • 符号:对语言字母表中的每个符号a,正则表达式a表示仅包含字符串a的语言。
  • 或:对于给定的两个正则表达式M和N,可以利用或操作(|)连接为一个新的正则表达式:M|N。若一个字符串属于语言M或语言N,那么此串也属于语言M|N。因此,语言a|b包含两个字符串a和b。
  • 并:对于给定的两个正则表达式M和N,可以利用并操作(·)将其连接为新的正则表达式M·N。设α是语言M的字符串,β是语言N的字符串,若一个字符串是αβ的并,那么这个字符串属于语言M·N。因此,正则表达式(a|b)·a定义包含两个字符串aa和ba的语言。
  • ε:正则表达式ε代表了一个只包含空串的语言。因此(a·b)|ε表示语言{"", "ab"}。
  • 重复:对于正则表达式M,其Kleene闭包是M*。若一个字符串为空或者它是M中所有字符串经过并操作所得到的结果,那么它就属于M*。

以上这些概念就完整的定义了正则表达式,其中并没有我们所熟悉的那一套规则。不过其实那些规则都是用以上这些概念推导出来的,下面举几个简单的例子。在举例之前,再交代一下,并操作符和ε在书写时是可以省略的,而Kleene闭包的优先级高于并操作,并操作的优先级高于或操作。

  • [abcd] => (a|b|c|d)
  • [b-g] => [bcdefg]
  • [b-gM-Qkr] => [bcdefgMNOPQkr]
  • M+ => (M·M*)
  • M? => (M|ε)

你看,现在的正在表达式已经像回事儿了。接下去要做的无非就是引入特殊字符(.,\w,\s之类的)、贪婪模式、分组匹配等东东,不过核心的形式化模型就是上面的那些概念。

 

还真是佩服研究这种东西的人,可以把一个东东做的在理论和实战领域都这么优雅。

1
4
分享到:
评论

相关推荐

    正则表达式的具体介绍.docx

    正则表达式(Regular Expression,通常简写为regex、regexp或RE)是对字符串操作的一种逻辑公式,它使用一系列预定义的特定字符及其组合来构成“规则字符串”,从而实现对字符串的过滤和匹配逻辑。 正则表达式的...

    regexp_coq

    作为一个大学项目开始,此项目尝试在Coq中定义正则表达式并证明相关的引理和性质。 单词和语言的定义如下: Notation word := (list A). Notation language := (word -> Prop). 并被用来开发更复杂的术语。 引理 ...

    形式语言与自动机.rar

    3.1 非形式化描述 3.2 有穷自动机的基本定义 3.3 非确定的有穷自动机 3.4 具有£转移的有穷自动机 3.5 有穷自动机的应用 3.5.1 在文本中查找字符串 3.5.2 用于文本搜索的非确定的有穷自动机 3.5.3 识别...

    proposal-regexp-unicode-sequence-properties:建议在Unicode属性中添加对序列属性的支持,以转义至ECMAScript正则表达式

    此后,Unicode正式使用属性域中的“代码点属性”与“字符串属性”对它进行了形式化定义。 参见 。 另外,我们通常交替使用“字符”和“代码点”。 更正式地说,“字符”是指分配的代码点,但是属性具有所有代码点...

    计算理论引论 课后答案

    正则表达式的形式定义及与有穷自动机的等价性。 了解并掌握非正则语言及其泵引理并能应用它证明语言的非正则性。 (2)上下文无关语言。 上下文无关文法的形式定义、举例及设计简单的上下文无关文法,上下文无关...

    你必须知道的495个C语言问题

    第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的...

    《编译原理及实践》电子书下载

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    Sed与Awk (中文版)

    因为所有这三个程序都使用UNIX正则表达式,因此书中用一章的篇幅来介绍UNIX的正则表达式语法。 然后,本书介绍如何编写sed脚本。从编写几行简单的脚本开始,学习进行手工编辑操作的其他基本命令和高级命令,以及由此...

    《编译原理》 清华 第二版

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    C#编译原理 ZIP 压缩文件

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    编译原理中文版

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    编译原理--龙书

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有...

    编译原理(china-pub) 高清

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    编译原理及实践

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    编译原理及实践 附有目录

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

    自动机理论语言和计算导论(英文第2版)(djvu)

    本书注重定义、定理的准确性和严格性,注重学生形式化和严格的数学推理能力的培养,同时在定义和证明中运用直观的方法说明抽象概念,借助许多图表帮助传达思想,并包含大量难度各异的示例和习题,便于读者加深对内容...

    Sed与awk 中文第二版

    因为所有这三个程序都使用unix正则表达式,因此书中用一章的篇幅来介绍unix的正则表达式语法。 然后,本书介绍如何编写sed脚本。从编写几行简单的脚本开始,学习进行手工编辑操作的其他基本命令和高级命令,以及由此...

    编译原理及实现

    2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷...

Global site tag (gtag.js) - Google Analytics