正则速查表:10个模式覆盖90%的实际工作
Source: Dev.to
你需要了解的六个字符
\d → any digit (0-9)
\w → any word character (letter, digit, underscore)
\s → any whitespace (space, tab, newline)
\D → any NON-digit
\W → any NON-word character
\S → any NON-whitespace
大写字母表示取反。这就是完整的含义。
量词
+ one or more
* zero or more
? zero or one (optional)
{3} exactly 3
{2,5} between 2 and 5
{3,} 3 or more
* 与 + 的区别很重要:\d* 可以匹配空字符串(零个数字也是合法的),\d+ 则至少需要一个数字。若不确定,建议使用 +。
我最常复制粘贴的 10 条正则
1. 邮箱
[\w.-]+@[\w.-]+\.\w{2,}
不是 RFC 完全匹配,也不需要。足以处理实际使用中的邮箱。
const emails = text.match(/[\w.-]+@[\w.-]+\.\w{2,}/g);
2. URL
https?:\/\/[\w\-._~:\/?#\[\]@!$&'()*+,;=%]+
s? 使得 “s” 成为可选,从而同时匹配 http 和 https。
const urls = text.match(/https?:\/\/[\w\-._~:\/?#\[\]@!$&'()*+,;=%]+/g);
3. 美国电话号码
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
能够匹配 123-456-7890、(123) 456-7890、123.456.7890 与 1234567890。
4. IP 地址(IPv4)
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
\b(单词边界)非常关键,若省略会把更长字符串中的数字也匹配进去。
5. 日期(YYYY‑MM‑DD)
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])
既校验格式,又确保月份在 01‑12、日期在 01‑31 之间。
6. 十六进制颜色
#(?:[0-9a-fA-F]{3}){1,2}\b
同时匹配短格式 #fff 与长格式 #ff00aa。
7. 双引号之间的所有内容
"([^"]*)"
捕获组 ([^"]*) 把内容提取出来。[^"]* 表示“除引号外的任意字符,零次或多次”。
8. 整词匹配
\bword\b
\b 是单词边界锚点。\bcat\b 能匹配 “cat”,但不会匹配 “catch” 或 “concatenate”。
9. 可选小数的数字
-?\d+\.?\d*
匹配 42、3.14、-7、-0.5 等。
10. 多个空白字符(用于清理)
\s{2,}
查找两个或以上连续的空白字符,并可替换为单个空格。
const clean = text.replace(/\s{2,}/g, ' ');
我经常看到的三大错误
1. 未对句点进行转义。 . 匹配任意字符,而 \. 才匹配真实的句点。
2. 贪婪 vs 懒惰。 对字符串 "hello" and "world" 使用 ".*" 会匹配 "hello" and "world"(从第一个引号到最后一个引号的全部内容)。使用 ".*?" 可匹配最短的:分别得到 "hello" 和 "world"。
3. 忘记 g 标志。 没有 g 时只能得到第一个匹配,添加 g 可全局匹配。
// 只匹配第一个
'abc 123 def 456'.match(/\d+/); // ["123"]
// 匹配全部
'abc 123 def 456'.match(/\d+/g); // ["123", "456"]
在线试一试
我构建了一个 regex tester ,具备实时匹配高亮和内置速查表。粘贴正则、粘贴文本,即可立刻看到匹配结果。完全在浏览器中运行,不会存储任何数据。
完整的速查表(包括前瞻/回顾等更多示例)请参见……