写满火星文?正则表达式 (Regex) 从入门到精通指南

看到 /^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/ 这一长串仿佛在键盘上撒把米让鸡啄出来的乱码,很多人第一反应是“我是谁?我在哪?这玩意也能被叫做编程语言?”

然而,这就是正则表达式 (Regular Expression)。一旦你跨过那道看上去很高的语法门槛,它将成为你职业生涯中最常使用的终极武器:无论是爬虫提取数据、日志清洗、还是用户注册时的邮箱格式校验。

一、什么是正则表达式?为什么要用它?

想象你在用一个很傻的文本查找工具(例如按下 Ctrl+F)。你想找文本里所有的邮箱地址。你总不能把整个世界所有的邮箱挨个输入一遍去搜吧?你需要的是形容一种“规律 (Pattern)”:“请帮我找一串英文字母或数字,然后中间夹着一个 @ 符号,然后再跟几个字母,接着一个点,最后是一两个英文字母。”

而正则表达式,就是这样一门极其紧凑的、用来描述字符串匹配规则的迷你编程语言。

二、拆解常用魔法符号(元字符)

正则表达式之所以看起来像天书,是因为它用了大量的符号来表示“任何字符”、“开头和结尾”以及“重复次数”。让我们把最基础的兵器库亮出来:

1. 特殊占位符

  • . (点号):匹配几乎任意一个字符。就像扑克牌里的百搭牌。
  • \d:匹配任意一个数字 (Digit)。等价于 [0-9]。
  • \w:匹配任意一个字母、数字或下划线 (Word)。
  • \s:匹配任意一个空白符 (Space),包括空格、Tab缩进或换行。

注意:如果是大写字母,意思就必须是反过来。比如 \D 就是匹配“非数字的任意字符”。

2. 指向边界

  • ^:表示字符串的开始。
  • $:表示字符串的结尾。

这两个符号在表单校验里至关重要。比如你写 \d{4} 来匹配4位数字,但如果不加边界,输入 `12345` 也会匹配成功(因为它包含了前四位1234)。正确的写法是:^\d{4}$(必须从头到尾只有恰好四位数字)。

3. 重复的次数(量词)

  • *:前面的字符可以出现0次或很多次。(可有可无,多多益善)
  • +:前面的字符可以出现1次或很多次。(必须得有,多多益善)
  • ?:前面的字符可以出现0次或1次。(有或者没有都行)
  • {x,y}:限制必须出现 x 到 y 次之间。例如手机号一般是 \d{11}

三、贪婪模式与“懒惰”模式

这是正则里最大的坑之一。假设有一段 HTML 文本:<div>你好</div>世界

如果你用 <.*> 去匹配它,你会惊恐地发现引擎直接把 <div>你好</div> 甚至到文本的最末尾都给包了进去!为什么?

因为默认情况下,正则的量词 *+ 非常“贪婪”,它们总是试图匹配尽可能长的字符串。想要让它们变得懒惰(即一旦满足条件就赶紧刹车停止),我们需要在后面加一个问号:.*?。这样写,引擎在匹配到第一个 > 时就会停下,乖乖返还给你 <div>

四、实战演练与工具推荐

正则表达式的终极学习法只有一个:不断地在测试仪上敲击和试错。单纯靠眼睛去解析长长的正则无异于自寻死路。

我们强烈建议您使用本站提供的免费 正则表达式测试器 (Regex Tester)。您可以实时高亮您键入规则后匹配到的字符串结果,并一目了然地分析捕获的组数据 (Capturing Groups)。赶快去试试将这层窗户纸捅破吧!