正则表达式语法简介
正则表达式(Regular Expression)与有限状态机(Finite State Machine, FSM)在数学上是等价的。
一、 发明历史与最初目的
正则表达式的诞生,是纯粹的数学理论向计算机工程转化的经典案例。
- 理论起源(1950年代): 数学家斯蒂芬·科尔·克林(Stephen Cole Kleene)在研究早期的神经网络和有限状态自动机时,发明了一种叫做“正则集合”(Regular Sets)的数学符号。它的最初目的,仅仅是为了在数学上描述和推导神经元的活动模式。
- 工程落地(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+)匹配引脚名并将其捕获(括号的作用是告诉引擎“我稍后要单独提取这段内容”)。
留下评论