少于 1 分钟阅读 次阅读

正则表达式(Regular Expression)与有限状态机(Finite State Machine, FSM)在数学上是等价的。

一、 发明历史与最初目的

正则表达式的诞生,是纯粹的数学理论向计算机工程转化的经典案例

  1. 理论起源(1950年代): 数学家斯蒂芬·科尔·克林(Stephen Cole Kleene)在研究早期的神经网络和有限状态自动机时,发明了一种叫做“正则集合”(Regular Sets)的数学符号。它的最初目的,仅仅是为了在数学上描述和推导神经元的活动模式
  2. 工程落地(1968年): Unix 的缔造者之一肯·汤普逊(Ken Thompson)读到了克林的论文,敏锐地意识到这种理论可以用来做文本搜索。他将这套算法写进了 QED 文本编辑器中。 随后,他在 Unix 的 ed 编辑器中加入了一个专门用于搜索正则表达式的命令:g/re/p (意思是 Global Regular Expression Print)。这个命令后来独立出来,成为了 Linux 中大名鼎鼎的 grep 工具。

二、 快速学会正则表达式

不要死记硬背完整的规范,我们只记最核心的构建块。正则表达式就像乐高,由字符类数量词边界拼接而成。

1. 核心语法速查手册

符号 含义(它代表什么) 记忆法 / 示例
. 匹配除换行符外的任意单个字符 通配符,就像扑克牌里的“赖子”
\d 匹配任意数字 (0-9) Digit
\w 匹配任意字母、数字或下划线 Word character
\s 匹配任意空白符(空格、Tab等) Space
* 匹配前面的字符 0 次或多次 可能会有,也可能有很多
+ 匹配前面的字符 1 次或多次 至少得有一个
? 匹配前面的字符 0 次或 1 次 可有可无
{n,m} 匹配前面的字符 n 到 m 次 \d{3,4} 匹配 3 到 4 位数字
[] 匹配括号内的任意一个字符 [abc] 匹配 a, b, 或 c。[0-9a-fA-F] 匹配十六进制字符
^ / $ 匹配行的开头 / 结尾 锚点,定位用的

2. 实战应用场景

理论看完了,我们把它代入到具体的工程场景中:

场景 A:分析硬件压力测试日志 当你需要对设备进行拷机测试并分析日志时,可能会遇到大量的内存报错信息。你需要快速提取出所有发生 Bit-flip(位翻转)的物理内存地址。

  • 日志文本: Kernel panic: Bit-flip at physical address 0x3F8A2B90. Rebooting...
  • 正则表达式: 0x[0-9A-Fa-f]+
  • 拆解: 0x 是固定开头,[0-9A-Fa-f] 表示匹配所有的十六进制数字和字母,+ 表示这些十六进制字符至少出现一次。

场景 B:Python 自动化脚本提取数据 如果你在写 Python 脚本,想要从一个 SQLite 导出的文本或者某种配置文件中自动生成 Verilog 端口定义,你需要匹配特定的引脚名称。

  • 文本: pin_name: GPIO_A1, direction: INOUT
  • 正则表达式: pin_name:\s*(\w+)
  • 拆解: pin_name: 精确匹配,\s* 允许冒号后面有任意个空格,(\w+) 匹配引脚名并将其捕获(括号的作用是告诉引擎“我稍后要单独提取这段内容”)。

留下评论