JavaScript正则表达式前瞻与后顾详解

JavaScript正则表达式前瞻与后顾详解

en.javascript.info Modern JavaScript Tutorial en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

正则表达式中的"前瞻"(Lookahead)和"后顾"(Lookbehind)是两种强大的断言机制,它们允许我们在不消耗字符的情况下检查模式是否匹配。本文将深入探讨这两种高级正则表达式特性。

什么是前瞻与后顾

前瞻和后顾(统称为"环视")是正则表达式中的特殊语法,用于在匹配时检查前后文内容,但不会将这些内容包含在匹配结果中。

前瞻基础语法

前瞻有两种形式:

  1. 肯定前瞻 X(?=Y) - 匹配X,仅当后面跟着Y时
  2. 否定前瞻 X(?!Y) - 匹配X,仅当后面不跟着Y时
let priceStr = "1 turkey costs 30€";
console.log(priceStr.match(/\d+(?=€)/)); // 匹配"30",因为后面有€符号

否定前瞻示例

当我们需要匹配不跟随特定模式的内容时,否定前瞻非常有用:

let shoppingList = "2 turkeys cost 60€";
console.log(shoppingList.match(/\d+\b(?!€)/g)); // ["2"],排除了价格60€

后顾详解

后顾语法与前瞻类似,但检查的是前面的内容:

  1. 肯定后顾 (?<=Y)X - 匹配X,仅当前面有Y时
  2. 否定后顾 (?<!Y)X - 匹配X,仅当前面没有Y时
let usPrice = "1 turkey costs $30";
console.log(usPrice.match(/(?<=\$)\d+/)); // 匹配"30",因为前面有$符号

注意:后顾功能在某些浏览器(如Safari)中可能不被支持

高级应用技巧

多重条件检查

可以组合多个前瞻条件进行复杂匹配:

let complexStr = "1 turkey costs 30€";
console.log(complexStr.match(/\d+(?=\s)(?=.*30)/)); // 匹配"1"

这个例子中,我们查找的数字必须:

  1. 后面跟着空格
  2. 字符串中某处有"30"

捕获环视内容

默认情况下环视内容不会被捕获,但可以通过额外括号实现:

let multiCurrency = "Price is 30€, 300kr";
let regex = /\d+(?=(€|kr))/g;
let matches;
while ((matches = regex.exec(multiCurrency)) !== null) {
  console.log(`Amount: ${matches[0]}, Currency: ${matches[1]}`);
}
// 输出:
// Amount: 30, Currency: €
// Amount: 300, Currency: kr

性能考量与替代方案

虽然环视功能强大,但在处理大文本时可能影响性能。替代方案包括:

  1. 使用普通匹配后过滤结果
  2. 利用字符串的index和context进行二次验证
let text = "Items: 1 for $10, 2 for $20";
let numbers = text.match(/\d+/g).filter(num => {
  let index = text.indexOf(num);
  return text[index + num.length] !== '$';
});
console.log(numbers); // ["1", "2"]

总结对比表

| 模式语法 | 类型 | 匹配条件 | |----------------|--------------|----------------------------| | X(?=Y) | 肯定前瞻 | X后面跟着Y | | X(?!Y) | 否定前瞻 | X后面不跟着Y | | (?<=Y)X | 肯定后顾 | X前面是Y | | (?<!Y)X | 否定后顾 | X前面不是Y |

掌握前瞻和后顾技术可以显著提升正则表达式的表达能力,特别是在需要基于上下文进行匹配的场景中。合理使用这些特性可以编写出更精确、更高效的模式匹配规则。

en.javascript.info Modern JavaScript Tutorial en.javascript.info 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童福沛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值