正则速查表:10个模式覆盖90%的实际工作

发布: (2026年3月5日 GMT+8 19:45)
4 分钟阅读
原文: Dev.to

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” 成为可选,从而同时匹配 httphttps

const urls = text.match(/https?:\/\/[\w\-._~:\/?#\[\]@!$&'()*+,;=%]+/g);

3. 美国电话号码

\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

能够匹配 123-456-7890(123) 456-7890123.456.78901234567890

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*

匹配 423.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 ,具备实时匹配高亮和内置速查表。粘贴正则、粘贴文本,即可立刻看到匹配结果。完全在浏览器中运行,不会存储任何数据。

完整的速查表(包括前瞻/回顾等更多示例)请参见……

0 浏览
Back to Blog

相关文章

阅读更多 »