本文档概述了正则表达式(regex)引擎、它们的架构、实现方法以及构建自己的引擎的资源。正则表达式引擎是文本处理应用程序中的基本组件,允许通过专门的语法进行模式匹配和文本操作。本页面侧重于从头开始创建正则表达式引擎的技术方面,而不是仅仅使用现有引擎。
有关可能使用正则表达式引擎的编程语言的信息,请参阅编程语言和编译器。
正则表达式引擎是一个软件组件,它根据专门的微语言中定义的模式匹配规则处理文本。它接收一个模式(即正则表达式)和一个输入文本,然后确定该模式是否以及在何处与文本匹配。
正则表达式引擎通常遵循三种主要的实现方法之一,每种方法都具有独特的特点和权衡。
| 方法 | 描述 | 特性 |
|---|---|---|
| 回溯 | 递归算法,尝试不同的可能性,并在失败时回溯 | 最灵活,支持回溯引用等高级功能,但在最坏情况下性能可能呈指数级下降 |
| NFA(非确定性有限自动机) | 同时遵循多条可能的路径 | 功能和性能的良好平衡 |
| DFA(确定性有限自动机) | 始终处于精确一个状态,并只有一个可能的转换 | 最快的性能,线性时间复杂度,但功能支持有限 |
一个典型的正则表达式引擎由几个关键组件组成,它们协同工作以处理模式并匹配文本。
该仓库提供了使用多种编程语言构建正则表达式引擎的教程,每种教程都着重介绍不同的实现方法
Ken Thompson 1968年的原始方法侧重于将正则表达式直接编译为机器代码。普林斯顿的实现采用递归方法,侧重于简洁性。
JavaScript 教程范围从最小的实现(少于 40 行代码)到演示不同理论基础的更全面的引擎
该仓库还包括构建正则表达式引擎的教程,涵盖:
在构建正则表达式引擎时,需要实现几个核心组件。
正则表达式匹配涉及几个理论计算机科学概念:
来源:README.md338-339 README.md341
正则表达式引擎的性能会因实现方法和输入模式而显著不同
| 考量因素 | 描述 |
|---|---|
| 灾难性回溯 | 在使用某些模式的回溯引擎中,性能呈指数级下降 |
| NFA 与 DFA 的权衡 | NFA 构造更快但匹配更慢;DFA 构造更慢但匹配更快 |
| 增量编译 | 按需编译正则表达式,而不是一次性编译所有 |
| 优化 | 模式特定优化,字符类优化 |
| 字面量前缀 | 针对以字面量文本开头的模式的快速路径 |
构建正则表达式引擎时的常见挑战包括:
该仓库提供了基于不同实现方法的教程:
构建一个正则表达式引擎能深入了解形式语言理论、自动机以及实用的文本处理技术。所选择的实现方法将显著影响最终引擎的功能集和性能特征。通过探索仓库中提供的各种教程,开发者可以从理论和实践两方面对正则表达式引擎获得透彻的理解。