🏠 首页 攻略 正则表达式是什么?字符串匹配的瑞士军刀

正则表达式是什么?字符串匹配的瑞士军刀

正则表达式是字符串匹配的强大工具,被称为程序员手中的"瑞士军刀"。这篇百科带你从入门到理解核心用法。

你有没有写过这样的代码:一段文字里找出所有邮箱地址?或者从日志文件中筛选出错误行?如果全靠手动比对,那工作量简直噩梦一场。这时候,正则表达式登场了——它是一套专门的字符串匹配规则,能让你用一行代码搞定复杂文本查找。

一、它是个啥?

正则表达式(Regular Expression,简称 regex 或 regexp),不是某种编程语言,而是一套匹配规则。你可以把它想象成一个"搜索模板",告诉计算机:“我要找的是符合这种模式的字符串”。

比如 \d{3}-\d{4} 这个规则,意思是"三个数字 + 短横线 + 四个数字"。它能匹配 010-8888139-5555 这样的格式,但不会匹配 abc-def

二、为啥要学它?

理由很实在:省时省力、精准高效

  • 表单验证:用户输入邮箱时,自动检查格式对不对
  • 数据清洗:从一堆杂乱的文本中提取有用信息
  • 代码重构:批量替换某类模式,不用一个字符一个字符改
  • 日志分析:快速筛选出包含特定关键字的行

很多新手觉得正则太难,其实日常 80% 的场景只需要掌握十几个符号就够了。

三、怎么用?先看几个核心符号

正则的语法确实有点晦涩,但记住了几个高频符号,就能应付大部分情况:

符号含义示例
\d任意数字\d+ 表示一个或多个数字
.任意单个字符(换行除外)a.c 能匹配 abc, a2c
*前项出现零次或多次ab*cac, abc, abbbbc
+前项出现一次或多次ab+cabc, abbbc(至少一个b)
?前项出现零次或一次colou?r 同时匹配 color 和 colour
^行首^Hello 表示以 Hello 开头
$行尾world$ 表示以 world 结尾
\s空白符(空格、制表、换行)\s+ 匹配连续空白
[abc]括号内任一字符[aeiou] 匹配任意元音字母
( )分组,可捕获内容(\d{3})-(\d{4}) 分成两组

再看个实际例子:匹配邮箱的基本规则

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

解释一下:

  • ^ 行首开始
  • [a-zA-Z0-9._%+-]+:用户名部分,字母数字加点等特殊符号,至少一个
  • @:必须带 @ 符号
  • [a-zA-Z0-9.-]+:域名主体
  • \.:分隔点的字面量(需要转义)
  • [a-zA-Z]{2,}:后缀至少两个字母
  • $ 行尾结束

当然,完整的邮箱正则要复杂得多,但这个基础版已经能覆盖大多数场景了。

四、在不同地方怎么用?

不同编程语言调用正则的方式略有不同,但底层规则一致。

JavaScript:

const email = 'user@example.com';
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
pattern.test(email); // true

Python:

import re
email = 'user@example.com'
pattern = r'^[^\s@]+@[^\s@]+\.[^\s@]+$'
bool(re.match(pattern, email))  # True

grep (命令行):

# 查找日志中包含 IP 地址的行
grep -Eo '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' app.log

VS Code / Sublime: 在查找框开启正则模式(.*),可以直接替换文本中的模式。

五、避坑指南

写正则时容易掉几个坑:别贪多求全,先满足当下需求;复杂模式要加注释,否则自己两个月后也看不懂;性能上,避免过度回溯,长文本测试时要留意效率。推荐用 regex101.com 在线调试,它实时展示每一步匹配过程,对新手超级友好。

六、总结一句话

正则表达式不是魔法,而是一套约定俗成的搜索规则。你不需要记住所有符号,掌握常用十来个,再配合在线工具查缺补漏,就能解决八成问题。下回写代码碰到字符串提取,先想想能不能用正则,说不定能少写一半行数。

你平时写正则时,最常在哪些场景用它?有没有遇到特别难搞的模式?欢迎在评论区分享你的实战经验。