tomai
登录

Regex 手册:真正会反复使用的模式

正则表达式把一整套搜索语言压缩进一行,所以在各个部件豁然开朗之前,总觉得晦涩难懂。本手册只覆盖 20% 的语法,解决 80% 的实际任务:从粘贴文本里找邮箱、校验输入、拆分日志、批量重命名文件。

1. 字面量、点号与字符类

大多数字符匹配自身,点号匹配除换行外的任意字符。方括号定义一个集合——[0-9] 匹配任意数字,[^0-9] 匹配除数字外的任意内容——而 \d\w\s 等简写分别覆盖数字、单词字符和空白。只要知道这个位置该出现什么,就优先用明确的字符类,而不是裸点号。

2. 锚点与量词

^ 锁定开头,$ 锁定结尾,所以 ^hi 只匹配以 hi 开头的字符串。+ 表示一次或多次,* 表示零次或多次,? 表示可选;在它们后面再加一个 ? 会切换为懒惰匹配,停在第一个可能的位置而不是最后一个。贪婪与懒惰的区别,是最常见的意外匹配来源。

3. 分组、分支与前后查找

圆括号负责分组并捕获——(cat|dog)s? 匹配 cat、cats、dog 或 dogs——而 (?:…) 只分组不捕获。\d+(?=px) 这类前查找会检查后面的内容但不消耗它,因此可以要求一个后缀,同时把它留在原地供下一次匹配使用。命名分组能让下一个读到这个模式的人一眼看懂意图。

4. 标志改变一切

结束斜杠后面的字母会调整引擎行为:g 找出全部匹配而不是第一个,i 忽略大小写,m 让锚点按行生效,s 让点号跨过换行,u 启用完整 Unicode,y 把匹配固定在指定位置。很多看起来正确的模式返回空结果,原因都是标志组合不对。

5. 回溯陷阱

(a+)+ 这类嵌套量词,遇到很长又不匹配的字符串时,会让引擎走上指数级数量的路径,直接冻住整个标签页。保持重复结构扁平,在支持的环境里改写成占有式量词或原子组,上线前先用恶意输入测一遍可疑模式——粘贴进 our regex tester,每个匹配和分组都会在浏览器里实时高亮。