正则表达式

2025 年 6 月 3 日 | 阅读 5 分钟

众所周知,正则表达式(通常写成“regex”)是预定义的模式,主要用于帮助个人定义和识别特定类型的字符串。它们与计算机科学中的一个概念紧密相关,该概念称为“有限自动机”,有限自动机是主要用于识别数据中的模式或序列的基本机器。

正则表达式负责以直接而强大的方式有效地描述所谓的正则语言——一组遵循特定规则的字符串。

Regular expression

要点

与使用正则表达式相关的各种要点如下:

  • 正则表达式是定义字符串的模式序列。它用于表示正则语言。
  • 它也用于匹配字符串中的字符组合。字符串搜索算法使用此模式来查找字符串上的操作。
  • 在正则表达式中,x* 表示 x 的零次或多次出现。它可以生成 {e, x, xx, xxx, xxxx,.....}
  • 在正则表达式中,x+ 表示 x 的一次或多次出现。它可以生成 {x, xx, xxx, xxxx,.....}

个人可以将正则表达式视为搜索模式,这些模式更常用于有效的文本处理。

  • 例如,如果我们实际上想在一个文档或一段代码中查找单词、字符或字符序列的所有实例,正则表达式可以帮助我们高效地做到这一点。

此外,如果一个模式满足某些基本规则,它就被认为是一个有效的正则表达式。

  1. ɸ (phi) 是一个正则表达式,用于表示根本没有有效字符串的语言。
  2. ɛ (epsilon) 是一个正则表达式,用于表示仅包含空字符串的语言。
  3. 如果 a 是字母表中的单个字符(由符号 Σ 有效表示),那么在这种情况下,a 是一个有效的正则表达式,它只匹配字符串“a”。
  4. 但是,如果 a 和 b 是正则表达式,那么 a + b (或 a | b) 也是正则表达式。这意味着字符串可以匹配 a 或 b
  5. 组合 ab 也被称为有效的正则表达式,主要表示 a 后跟 b 的序列。
  6. 最后,如果 a 是正则表达式,那么在这种情况下,a* 表示“a 的零次或多次重复”。

尽管如此,两个正则表达式被认为是相等或等效的,如果它们生成相同的字符串集。例如,**(a + b)** 和 **(a + b)*** 都产生相同的字符串,这意味着匹配一个字符串的任何字符串也将匹配另一个。正则表达式是计算许多领域中的关键工具,从数据验证到搜索工具,掌握它们可以显著提高我们高效处理文本的效率。

正则语言上的操作

正则语言上的各种操作是:

并集:如果 L 和 M 是两个正则语言,那么它们的并集 L U M 也是一个并集。

交集:如果 L 和 M 是两个正则语言,那么它们的交集也是一个交集。

克莱尼闭包:如果 L 是一个正则语言,那么它的克莱尼闭包 L1* 也将是一个正则语言。

示例

写出语言的正则表达式

L = {abn w:n ≥ 3, w ∈ (a,b)+}

解决方案

语言 L 的字符串以“a”开头,后跟至少三个 b。它包含至少一个“a”或一个“b”,即字符串为 abbba, abbbbbba, abbbbbbbb, abbbb.....a

所以正则表达式是

r= ab3b* (a+b)+

这里 + 是正闭包,即 (a+b)+ = (a+b)* - ∈

正则表达式(RE)的应用

Regular expression

使用正则表达式的各种应用如下:

  1. 数据验证:正则表达式通常用于检查用户输入是否符合特定模式。例如,它们用于验证表单中的电子邮件地址、电话号码、邮政编码或密码格式。
  2. 数据抓取:RE 有助于个人有效地从选定的网站集或文本文件中提取所有有用的数据。
    例如,在网页抓取过程中,从网页中提取产品名称、价格或联系方式。
  3. 数据清理/整理:在大型数据集中,RE 用于在分析之前有效地删除不需要的字符、修复格式问题或标准化数据条目。
  4. 文本搜索:它们通过查找与特定模式匹配的字符串来实现强大的搜索功能——比简单的关键字搜索更灵活。
  5. 语法高亮:代码编辑器通常使用正则表达式来检测编程关键字、字符串或注释,并以不同的颜色显示它们以提高可读性。
  6. 简单解析:RE 有助于将文本拆分成部分,例如将句子拆分成单词或从 HTML 中提取特定标签。
  7. 编译器设计:在编程语言编译器中,正则表达式在词法分析阶段用于识别源代码中的标记。
  8. 命令行实用程序:grep、sed 和 awk 等工具通常使用 RE 高效地过滤和转换 shell 脚本或终端命令中的文本。

常见问题解答/FAQ

关于正则表达式使用的各种常见问题如下:

问题 1:在计算理论(TOC)中,什么是正则表达式?

答案:在计算理论中,正则表达式有效地将字符串描述为用于特定语法的模式。它主要用于定义正则语言,有限自动机能够有效地识别这些语言。

问题 2:你能举一个正则表达式的例子吗?

答案:是的。正则表达式模式告诉我们允许哪些类型的字符串。

例如,正则表达式 a*b 匹配以“b”结尾并且前面可以有任意数量的“a”(包括零个)的字符串。诸如“b”、“ab”、“aab”甚至“aaaaab”之类的字符串都匹配此模式。这些在从搜索功能到编程和正式语言分析的各个方面都非常有用。


下一主题DFA 优化