跳到主要内容
FreeOnlineTools Go
简体中文
参考

正则表达式速查表:语法、标志与常见模式

作者:FreeOnlineTools Team · 更新日期:2026-08-28

快速解答

正则表达式组合了文字字符、元字符 (.、\d、\w、\s)、量词 (*、+、?、{n,m})、锚点 (^、$、\b) 和组 ((...)、[...])。 g(全局)、i(不区分大小写)、m(多行)等标志会更改匹配行为。在将测试模式嵌入代码之前,它们与我们的正则表达式测试器一起存在。

介绍

正则表达式 (regex) 使用紧凑的形式语言描述文本模式。每种现代编程语言、编辑器和搜索工具都支持它们。此备忘单是 ECMAScript(由 JavaScript 使用)定义的语法以及您可以复制和改编的常见模式的参考。使用我们的正则表达式测试器针对浏览器中的示例文本尝试任何模式。

步步

  1. 字符类——匹配一组字符

    [abc] 匹配 a、b 或 c。 [^abc] 匹配除 a、b、c 之外的任何内容。 [a-z] 匹配任何小写字母。预定义类:\d = [0-9]、\D = 非数字、\w = [A-Za-z0-9_]、\W = 非单词、\s = 空格、\S = 非空格、. = 除换行符之外的任何字符(使用 s 标志来包含换行符)。

  2. 量词——重复多少次

    * = 0 或更多。 + = 1 或更多。 ? = 0 或 1。{n} = 恰好 n。 {n,} = 至少 n。 {n,m} = n 和 m 之间。添加 ?用于惰性匹配(例如 *? 匹配尽可能少的)。贪婪是默认设置,可能会导致嵌套模式灾难性的回溯。

  3. 锚点和边界——在哪里匹配

    ^ 匹配字符串的开头(或带有 m 标志的行)。 $ 匹配结尾。 \b 匹配单词边界(\w 和 \W 之间)。 \B 匹配非单词边界。锚点是零宽度的——它们测试位置而不消耗字符。

  4. 分组及轮换

    (abc) 是一个捕获组;使用 $1、$2 进行替换。 (?:abc) 是非捕获组。 (?=abc) 是一个前瞻(断言接下来的内容)。 (?!abc) 是否定的前瞻。 (?<=abc) 是向后查找 (ES2018+)。 a|b 是交替(a 或 b)。

  5. Flags——改变匹配行为

    g = 全局(查找所有匹配项,而不仅仅是第一个)。 i = 不区分大小写。 m = 多行(^ 和 $ 匹配行边界)。 s = dotAll (. 匹配换行符)。 u = unicode(将模式视为 Unicode 代码点;表情符号和星体字符需要)。 y = 粘性(仅在lastIndex处匹配)。

示例

匹配电子邮件地址(实用,RFC 5322 简化)

输入: Pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/

输出: 匹配“user@example.com”和“a.b@sub.domain.co”,但不匹配“plainaddress”或“@no-user.com”

从 CSS 中提取所有十六进制颜色代码

输入: Pattern: /#[0-9a-fA-F]{3,8}\b/g

输出: In 'color: #fff; background: #1a2b3c4d' finds ['#fff', '#1a2b3c4d']

验证 ISO 8601 日期 (YYYY-MM-DD)

输入: Pattern: /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/

输出: 匹配“2026-08-28”但拒绝“2026-13-01”和“2026-02-31”

使用捕获组将数字替换为 #

输入: “订单 42 已发货”替换为 /(\d+)/g →“#$1”

输出: “42 号订单已发货”

常见问题

  • 贪婪量词匹配太多:“<a><b>”上的“<.*>”匹配整个字符串“<a><b>”而不是“<a>”。首先使用“<.*?>”(惰性)来匹配“<a>”。
  • 灾难性回溯:输入“aaaaaaaaaaaaaaaaa!”上的嵌套量词如 (a+)+b可能需要指数时间。重写模式或在支持的情况下使用原子组/所有格量词。
  • 忘记 Unicode 的 u 标志:/^.$/ 匹配单个代码单元,因此像“😀”(两个代码单元)这样的表情符号在没有 u 标志的情况下会失败。匹配星体字符时始终添加 u。
  • 将 \b (单词边界)与 \s (空格)混淆: \b 在单词和非单词字符之间匹配,因此它也适用于字符串的开头/结尾。 \s 仅匹配实际的空白字符。

提示

  • 在将正则表达式嵌入到生产代码中之前,请务必在我们的正则表达式测试器中针对匹配和不匹配的样本进行正则表达式测试 - 边缘情况很容易被忽略。
  • 对于单个字符,优先选择字符类 [a-z] 而不是交替 (a|b|...|z) — 类更快、更清晰。
  • 当您不需要捕获的值时,请使用非捕获组 (?:...) — 捕获的性能成本很小,并且会使结果数组变得混乱。
  • 使用 new RegExp() 或模块范围内的文字编译一次正则表达式,而不是在热循环内 - 在每次迭代时重新编译相同的模式会浪费 CPU。

相关工具

相关指南

参考