← 返回首页

使用指南

JavaScript 正则表达式:语法、标志与常用模式

从字符、量词和分组读懂 JavaScript RegExp,并用可验证的常用模式处理匹配与替换。

JTools 维护者 · 更新于 2026-10-15

正则表达式描述的是一段文本的结构,而不是一种独立的数据校验方案。先明确要匹配整段文本还是其中一部分,再用小样本同时验证命中和不应命中的情况。本站输入框只填写模式本身,不需要最外层的斜杠。

本页对应当前浏览器的 JavaScript RegExp。参考资料中常见的 PCRE、.NET、Java 或旧 JScript 写法不一定可以直接使用;尤其是 Unicode、反向引用和后顾断言,应以目标运行环境实际支持的语法为准。

1. 普通字符、点号与转义

普通字母、数字和未具有特殊意义的字符按字面匹配。要匹配正则控制字符本身,必须在前面写反斜杠;在 JavaScript 字符串字面量里再写正则时,反斜杠还需要额外转义一次。

语法含义示例
cat依次匹配 c、a、t 三个字符。在 concatenate 中命中 cat
\.匹配一个字面句点,而不是任意字符。版本 1.2 中命中 .
.默认匹配除行终止符外的任意一个字符;开启 s 后也匹配行终止符。a.c 可匹配 abc 或 a-c
\n / \t / \r换行、制表和回车等控制字符。用 \s 可覆盖多数空白情形
\x41 / \u4E2D / \u{1F600}两位十六进制、四位 Unicode 与码点转义;花括号形式需要 u 标志。\u4E2D 匹配 中

2. 字符类与范围

方括号只匹配其中一个字符。连字符在两个字符之间表示范围,在开头、结尾或转义后才表示字面连字符。\d、\w 并不等于所有 Unicode 的数字和文字;处理中文或其他文字时优先使用 Unicode 属性转义。

语法含义示例
[abc]匹配 a、b、c 中的任意一个字符。gr[ae]y 匹配 gray 或 grey
[^abc]匹配不在 a、b、c 集合中的任意一个字符。[^,]+ 读取逗号前的一段文本
[A-Za-z0-9_-]匹配 ASCII 字母、数字、下划线或连字符。适合受限的用户名字符集
\d / \DASCII 数字 0-9 / 非数字。\d{4} 匹配四位年份
\w / \WASCII 单词字符 [A-Za-z0-9_] / 非单词字符。\w+ 读取一个 ASCII 标识符
\s / \S空白字符 / 非空白字符。\s+ 匹配连续空格、制表或换行
\p{Script=Han}按 Unicode 属性匹配汉字;需要 u 标志。^\p{Script=Han}+$ 校验全为汉字

3. 量词:次数、贪婪与惰性

量词修饰紧挨着的一个字符、字符类或分组。默认量词会在能够让整个表达式成功的前提下尽量多取字符;在量词后追加 ? 可改为尽量少取。惰性不是“更准确”,结束边界仍要由后续模式限定。

语法含义示例
a* / a+前项出现 0 次或多次 / 1 次或多次。zo+ 匹配 zo、zoo,不匹配 z
a?前项出现 0 次或 1 次。colou?r 匹配 color 或 colour
a{3}前项恰好出现 3 次。\d{3} 匹配三位数字
a{2,} / a{2,5}前项至少 2 次 / 2 到 5 次。[A-Z]{2,5} 匹配 2 至 5 个大写字母
.*? / .+?惰性量词,尽量少地取字符。<.*?> 在 <b>x</b> 中分别取两个标签

4. 位置锚点与边界

锚点匹配位置,不消耗字符。要校验整个输入,通常需要同时使用 ^ 和 $;若输入可能含有末尾换行或需要严格限制格式,应同时检查业务规则。\b 的“单词”以 JavaScript 的 \w 语义为中心,不能用于中文分词。

语法含义示例
^字符串开头;m 标志下还匹配每一行的开头。^TODO: 查找行首标记
$字符串末尾;m 标志下还匹配每一行的结尾。;$ 查找每行末尾分号
\b单词字符与非单词字符之间的位置。\bcat\b 不匹配 concatenate 中的 cat
\B不是单词边界的位置。\Bcat\B 可匹配 concatenate 内部的 cat

5. 分组、分支与反向引用

圆括号可改变组合顺序,也能保存子匹配。只为组合而不需要结果时使用非捕获组,避免改变捕获编号。分支 | 的优先级较低,常需要用分组明确它的适用范围。

语法含义示例
(ab)捕获 ab,并在结果中作为第 1 组。(\d{4})-(\d{2}) 捕获年和月
(?:ab)只组合 ab,不创建捕获组。(?:jpg|png|webp)
(?<year>\d{4})命名捕获组,可通过 groups.year 或 $<year> 取得。日期表达式中的 year
a|b匹配 a 或 b。gr(a|e)y 等价于 gr[ae]y
\1 / \k<name>再次匹配第 1 个或命名捕获组捕获到的相同文本。\b(\w+)\s+\1\b 查找重复的 ASCII 单词

6. 环视:检查上下文而不消耗文本

环视只判断当前位置前后是否满足条件,最终匹配内容不包括断言内的字符。前瞻在大多数现代 JavaScript 环境中可用;后顾断言应在目标浏览器或运行时中验证兼容性。

语法含义示例
X(?=Y)正向前瞻:X 后面必须紧跟 Y。\d+(?=px) 读取 16px 的数字部分
X(?!Y)负向前瞻:X 后面不能紧跟 Y。foo(?!bar)
(?<=Y)X正向后顾:X 前面必须是 Y。(?<=¥)\d+ 读取价格数字
(?<!Y)X负向后顾:X 前面不能是 Y。(?<!-)\d+ 排除负号后的数字

7. 本工具可选的 JavaScript 标志

标志改变整个表达式的匹配规则。本工具的五个开关对应 JavaScript RegExp 的 g、i、m、s、u;它们可组合使用。页面仍会展示全部匹配以便检查,但替换预览是否替换全部命中由 g 决定。

语法含义示例
g全局匹配;替换时处理所有命中。/a/g 将 banana 中三个 a 都替换
i忽略英文字母大小写。/hello/i 匹配 Hello
m让 ^ 与 $ 在每个行边界也生效,不改变点号。/^TODO:/m 查找任意行的 TODO:
s让点号也匹配行终止符。/开始.*结束/s 可跨行匹配
u启用 Unicode 语义,支持码点与 Unicode 属性转义。/\p{Script=Han}/u 匹配汉字

8. 替换文本中的引用

替换预览使用 JavaScript String.prototype.replace 语义。替换文本不是新的正则表达式:其中的 $ 序列有专门含义,普通反斜杠不会像模式中一样自动创建转义。

语法含义示例
$&完整匹配文本。将链接替换为 [$&]
$1 到 $99第 1 至第 99 个捕获组;不存在的组不会产生预期内容。(\d{4})-(\d{2}) -> $2/$1
$<name>命名捕获组。(?<year>\d{4}) -> 年:$<year>
$` / $'匹配之前 / 之后的原始文本。通常仅在确有拼接需求时使用
$$一个字面 $。价格替换为 $$100,结果为 $100

9. 常用模式:从用途开始验证

以下模式适合作为测试起点,不是对真实身份、邮箱或网页内容的最终认证。长度、允许字符、域名规则及业务状态都应由应用自己的规则继续校验;不要用正则解析任意 HTML。

语法含义示例
^[A-Za-z0-9_-]{3,16}$3 至 16 位的受限用户名。alex_2026 合法,alex! 非法
^#?(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$三位或六位十六进制颜色。#0f7 或 00aa77
\b[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}\b常见邮箱文本的提取,不覆盖完整 RFC 邮箱语法。提取 support@example.com
^(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}$0.0.0.0 至 255.255.255.255 的 IPv4 文本。192.168.1.1 合法,256.1.1.1 非法
^\p{Script=Han}+$仅由汉字组成的文本;需开启 u。中文 合法,中文A 非法

10. 调试与性能边界

先从字面文本开始,逐步增加字符类、量词和分组;每一步都用匹配详情、捕获组和铁道图核对结构。铁道图帮助理解顺序、分支和重复,不替代 JavaScript 语法校验。

避免在同一段文本上使用重叠的可变长度量词和重复分支,例如 (a+)+ 或 (.*a)*。这类模式在接近但不匹配的长输入上可能产生灾难性回溯。本站在可终止 Worker 中运行测试,但生产系统仍应设置自身的长度、超时和资源限制。

打开工具