JS正则表达式进阶:分组、前瞻与替换
学习正则表达式中的捕获组、非捕获组、前瞻断言以及高级替换模式。 · 难度:入门 · +15XP
正则表达式进阶技巧
正则表达式是处理字符串的利器。除了基础的模式匹配,掌握分组、断言和替换策略能让你写出更强大的匹配逻辑。
1. 捕获组 ( )
圆括号用于创建捕获组,既可用于分组,也可提取匹配的子串。
const date = '2025-04-01';
const match = date.match(/(\d{4})-(\d{2})-(\d{2})/);
console.log(match[1]); // '2025'
console.log(match[2]); // '04'2. 非捕获组 (?: )
当只需要分组而不需要提取时,使用 (?:...) 提高性能。
const str = 'abc123';
const regex = /(?:abc|def)(\d+)/;
console.log(str.match(regex)[1]); // '123'3. 前瞻断言
- 正向前瞻 (?= ):后面必须匹配某个模式。
- 负向前瞻 (?! ):后面不能匹配某个模式。
const prices = '$10 $20 €30';
// 匹配以 $ 开头的数字
console.log(prices.match(/\d+(?=\$)/g)); // ['10', '20']4. 高级替换
在 replace 中可以使用 $1、$2 引用捕获组,还能传入回调函数。
| 模式 | 说明 |
|---|---|
$1 | 引用第一个捕获组 |
$& | 匹配的整个字符串 |
function | 对每个匹配执行函数 |
// 将日期格式从 YYYY-MM-DD 转为 DD/MM/YYYY
const date = '2025-04-01';
const reformatted = date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1');
console.log(reformatted); // '01/04/2025'练习提示
右侧有一个字符串,包含了多个邮箱地址。请使用正则表达式提取出所有邮箱的用户名部分(@之前的内容),并替换邮箱域名为 @example.com。