正则表达式是什么?
正则表达式(Regular Expression)是一种用特殊符号描述文本模式的迷你语言。它解决的核心问题是:从大量文本中找出符合某种规则的内容。例如从日志中提取所有邮箱、验证用户输入的手机号格式、批量替换日期格式。
几乎所有编程语言都内置正则支持(JavaScript、Python、Java、Go...),学会一次到处通用,是性价比最高的编程技能之一。
核心语法四件套
字符类:\d 匹配数字,\w 匹配字母数字下划线,\s 匹配空白,[abc] 匹配 a/b/c 之一,[^abc] 匹配除此之外的字符,. 匹配任意字符(除换行)。量词:* 零次或多次,+ 一次或多次,? 零次或一次,{3} 恰好 3 次,{3,5} 3 到 5 次。
分组与捕获:() 把多个字符视为整体,同时捕获内容供提取或引用;(?:) 只分组不捕获。位置断言:^ 行首,$ 行尾,\b 单词边界。掌握这四类,就能写出 80% 的日常正则。
10 个即拿即用的常用正则
以下正则覆盖了日常开发的高频验证场景。注意不同语言对正则的支持略有差异,使用前建议在测试工具中验证。
- 中国大陆手机号:^1[3-9]\d{9}$
- 邮箱:^[\w.-]+@[\w-]+(\.[\w-]+)+$
- 身份证号(18位):^\d{17}[\dXx]$
- URL:^https?://[\w.-]+\.[a-z]{2,}(/\S*)?$
- IP 地址:^(\d{1,3}\.){3}\d{1,3}$
- 日期 YYYY-MM-DD:^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
- 纯中文:^[一-龥]+$
- 强密码(8位+字母+数字):^(?=.*[a-zA-Z])(?=.*\d).{8,}$
- HTML 标签:<[^>]+>
- QQ 号:^[1-9]\d{4,10}$
在线调试:看得见的匹配过程
写正则最大的痛苦是「不知道为什么匹配不上」。在线正则测试工具实时高亮匹配结果,输入正则和测试文本立即看到匹配位置、捕获分组内容,支持全部修饰符(全局/忽略大小写/多行),是学习和调试的利器。
贪婪与非贪婪:最重要的一个概念
默认情况下量词是贪婪的:尽可能多地匹配。例如 <.+> 对 <div>text</div> 会匹配整行而不是两个标签。在量词后加 ? 变为非贪婪:<.+?> 则只匹配到第一个 >。
类似的还有回溯陷阱:嵌套量词如 (a+)+ 在特定输入下会导致指数级回溯(ReDoS 攻击),写复杂正则时务必用真实数据测试性能。
进阶:断言与反向引用
正向先行断言 (?=...):匹配后面跟着指定内容的位置。例如 \d+(?=元) 匹配价格数字但不包含「元」字。负向先行 (?!...) 则相反。反向引用 \1 引用第一个分组的内容,(\w)\1 可匹配连续重复的字符(如 aa、11)。
这些高级特性让正则可以完成看似不可能的匹配任务,但也显著增加复杂度。工程建议:正则超过 50 个字符时,优先考虑拆分为多个简单正则或用代码分步处理。