跳转到主要内容
模块 7 · 第 3 课(共 4)课程中的27/32~12 min
模块课程(3/4)

替换为回调

如果替换字符串不够,请传递 函数: str.replace(regex, (match, ...groups) => string)。回调被调用 对于每个匹配项,其返回值都会成为替换值。

JS
'prezzi: 10 20 30'.replace(/\d+/g, (m) => Number(m) * 1.22);
// "prezzi: 12.2 24.4 36.6" (22% VAT)

回调参数

JS
str.replace(regex, (match, p1, p2, ..., offset, original, groups) => ...);
  • match -- 整场比赛。
  • p1、p2、\u2026 -- 按顺序捕获的组。
  • offset -- 原始字符串中匹配的索引。
  • original -- 整个字符串。
  • groups -- 具有 命名组 的对象(如果有)。
JS
'2024-03-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, (_, a, m, g) => `${g}/${m}/${a}`);
// "15/03/2024"

回调给你任意的权力:解析、查找、转换、HTML 转义静态字符串无法执行的所有操作。

替换回调中的高级参数

回调函数接收多个参数:完整匹配、每个捕获的组、匹配在整个文本中的偏移量以及原始输入字符串。这使得复杂的基于上下文的转换逻辑成为可能。

尝试一下

锻炼#regex.m7.l3.e1
尝试:0加载中...

找出文本中的每个整数。 (替换时,您可以传递 `(m) => Number(m) * 2` 将其加倍。)

正在加载编辑器...
显示提示

使用 \\d+(一个或多个数字)将每个整数捕获为单个匹配项。

3 次尝试后可用的解决方案

复习练习

锻炼#regex.m7.l3.e2
尝试:0加载中...

查找每封电子邮件(简化形式:字母/数字/点/下划线@域)。这样回调就可以将其编辑为“***@domain”。

正在加载编辑器...
显示提示

将类扩展为 [\\w.]+ 以接受用户名和域中的点。

3 次尝试后可用的解决方案

额外的挑战

锻炼#regex.m7.l3.e3
尝试:0加载中...

Match every word consisting of letters in the text, so it can be transformed to uppercase via a callback.

正在加载编辑器...
显示提示

使用 [a-zA-Z]+ 查找简单字母。

3 次尝试后可用的解决方案