$& 表示整个匹配到的子串,用于 replace 的字符串替换中实现简洁声明式处理,如包装、高亮等;可与 $1、$2 等捕获组占位符共存,但不支持表达式求值,动态处理需用函数式替换。

在 JavaScript 中,String.prototype.replace() 支持一些特殊占位符(replacement string special placeholders),其中 $&(注意:HTML 中常写作 $& 是为了转义显示,实际代码中写 $&)代表**整个匹配到的子串**。它不是正则表达式中的捕获组,而是原始匹配内容本身,无论是否用了括号、是否全局匹配,只要匹配发生,$& 就返回那个确切的字符串。
为什么用 $& 而不是手动传参?
当使用函数作为替换参数时,第一个参数确实是匹配项,看似可替代 $&。但 $& 的优势在于:简洁、声明式、无需写函数体,且在多组捕获或复杂正则中仍能精准引用“本次匹配整体”。尤其适合简单包装、高亮、前后加标记等场景。
$& 在 replace 字符串替换中的基本用法
直接在 replacement 字符串中写 $&,它会被自动替换成当前匹配的完整文本:
-
"hello world".replace(/o/g, "[$&]")→"hell[o] w[o]rld"(每个o被包裹) -
"abc123def".replace(/\d+/, "[$&]")→"abc[123]def"(只替换第一个数字序列) -
"price: $19.99".replace(/\$\d+\.\d{2}/, "<em>$&</em>")→"price: <em>$19.99</em>"
与捕获组占位符配合使用更灵活
$& 可和 $1、$2 等共存,各自作用明确:
-
$&始终是整个匹配(含所有捕获内容) -
$1是第一个捕获组,$2是第二个,以此类推 - 例如:
"id-123-name".replace(/id-(\d+)-(\w+)/, "[$&] → [$1] + [$2]")
结果:"[id-123-name] → [123] + [name]"
注意:$& 不会二次解析,也不受引号影响
$& 是字面量占位符,不是变量,不参与 JS 表达式求值。它只在 replace 内部被识别:
-
"test".replace(/t/, "$&e")→"teste"($&替换为"t",再拼上"e") -
"a".replace(/a/, "$&$&")→"aa"(重复匹配项) - 不能写成
"$&.toUpperCase()"—— 那只是普通字符串,不会执行方法
若需动态处理匹配内容(如转大写、过滤、条件替换),应改用函数式替换:str.replace(regex, (match) => match.toUpperCase())。而 $& 适用于“原样保留+简单修饰”的轻量场景,清晰高效。

















