`

请您先登录,才能继续操作

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

    博客分类:
  • 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
分享到:
评论

相关推荐

    正则表达式可视化调试工具

    正则表达式可视化调试工具可以帮助开发者直观地看到正则表达式的匹配过程,通过图形化的方式展示匹配模式,从而更好地理解和优化正则表达式。这些工具通常具备以下功能: 1. **图形化展示**:将正则表达式转换为...

    正则表达式生成工具,正则表达式生成工具

    在编程语言中,正则表达式通常以字符串的形式存在,通过特定的语法和模式来定义需要匹配的文本特征。正则表达式生成工具,如"The Regulator",就是辅助开发者或用户创建、测试和优化正则表达式的软件。 正则表达式...

    正则表达式转DFA

    Java实现的这个项目提供了一个直观的方式去理解这一转换过程,并通过可视化结果加深对正则表达式和DFA之间关系的理解。源代码文件中应该包含了具体的实现细节,包括类的设计、方法的编写以及如何调用Graph库进行绘图...

    正则表达式解析类

    正则表达式由各种字符和特殊符号组成,用于定义字符串的模式。例如,".\*"表示匹配任意数量的任意字符,"^abc$"表示匹配以"abc"开头并以"abc"结尾的字符串。正则表达式提供了丰富的构造规则,如量词(+,?,*,{n,m...

    ASP.NET 中的正则表达式

    正则表达式能够帮助开发者验证用户输入、搜索字符串中的特定模式,以及进行复杂的文本格式化和替换。 在【ASP.NET 中的正则表达式】中,开发者可以利用内置的验证控件如`RegexValidator`来实施正则表达式规则,确保...

    unix下的正则表达式

    2. **扩展正则表达式**(Extended Regular Expression, ERE):这是更现代的形式,由POSIX标准定义,提供了更多的元字符和功能,如egrep和awk支持的正则表达式。 #### 二、元字符及其功能 元字符是正则表达式的...

    正则表达式学习课件PPT

    总结来说,正则表达式是IT行业中不可或缺的一部分,无论你是Web开发人员、数据分析师还是自动化测试工程师,都需要掌握这项技能。通过学习“正则表达式学习课件PPT”,初学者可以系统地了解并实践正则表达式,从而在...

    正则表达式和DFA

    接着,**NFA**是一种自动机模型,用于识别正则表达式定义的语言。与DFA不同,NFA在处理输入时可以有多个可接受的状态。当遇到输入符号时,NFA可以从当前状态转移到多个状态。NFA的一个关键特性是ε-转移,即无需任何...

    词法分析器(从正则表达式到状态矩阵)

    这种形式化表示使得我们可以通过简单的矩阵操作快速检验输入串是否符合定义的词法规则。 最后,词法分析器使用这个状态转换矩阵对输入字符串进行扫描。它从起始状态开始,根据输入字符在矩阵中移动,直到遇到结束...

    shell编程 之 正则表达式

    基础正则表达式是Shell中最基本的一种形式,它适用于大多数简单的文本匹配需求。 1. **通配符**:在Shell中,通配符通常用于文件名的匹配,例如`*`代表任何字符序列,`?`代表单个字符。但在正则表达式中,这些符号...

    正则表达式的ppt

    在JavaScript和Java中,正则表达式被广泛应用于数据验证、文本提取和格式化等任务。以下是对"正则表达式的ppt"中可能涵盖的知识点的详细说明: 1. **基础概念**:正则表达式(Regular Expression)由字符序列组成,...

    xml需求文档及正则表达式介绍

    总的来说,XML和正则表达式是IT领域的基础工具,掌握它们能帮助我们更好地处理和分析结构化数据。在实际项目中,理解XML的结构和编写清晰的需求文档至关重要,而熟练运用正则表达式可以提升数据处理的效率和精度。...

    详细的C#正则表达式基础教程

    - **实例化Regex对象**:`new Regex(pattern)`用于创建一个正则表达式实例,`pattern`参数是你要匹配的模式。 4. **匹配方法** - **Match()**:检查输入字符串是否与模式匹配,返回一个`Match`对象。 - **...

    VB用正则表达式提取网页中的链接

    在Web页面中,链接通常以`<a href="...">`的形式存在,通过正则表达式的匹配功能,可以精确识别并捕获这些链接地址,从而实现对网页内容的深度解析和数据提取。 ### 描述解读:“VB用正则表达式提取网页中的链接” ...

    MAC地址正则表达式

    这段代码首先定义了三个不同的正则表达式来匹配三种不同格式的MAC地址。然后,它遍历一系列MAC地址,并使用Python的`re`模块中的`fullmatch`函数来验证这些地址是否符合预期的格式。 #### 五、总结 通过上述介绍,...

    正则表达式入门

    正则表达式是一种形式化的语言,用来描述一组字符串的模式。在编程语言中广泛应用于字符串的搜索和替换操作。例如,可以用正则表达式来找出文档中所有的电子邮件地址或电话号码。 ##### **1.2 使用场景** - **数据...

Global site tag (gtag.js) - Google Analytics