Nodejs中js的正则没有"<=( exp)"吗?

Nodejs中js的正则没有"<=( exp)“吗?

看以一篇教程, 发现js有(?= exp)却没有(?<= exp), 如果使用了后者, 就会报错"Invalid group” 不知道是我的用法有问题还是js的语法不一样

4 回复

在 Node.js 中,JavaScript 的正则表达式确实支持向前查找(lookahead),但不直接支持向后查找(lookbehind)。向前查找有两种形式:正向前查找 (?=exp) 和负向前查找 (?!exp)。然而,向后查找只有从 ES2018 开始才被部分支持,具体来说是正向向后查找 (?<=exp),而负向向后查找 (?<!exp) 则需要更现代的 JavaScript 环境。

示例代码

假设我们有一个字符串数组,我们需要找出所有以 “http” 开头的 URL:

const urls = ['https://example.com', 'http://example.org', 'ftp://example.net'];

// 使用正向前查找 (?=exp)
const httpUrls = urls.filter(url => /^(?=http:\/\/|https:\/\/)/.test(url));
console.log(httpUrls); // 输出: ['http://example.org']

如果想要实现类似的功能,但需要确保 URL 以 “http” 结尾,我们可以使用不同的方法来模拟向后查找的效果。例如,我们可以先反转字符串,然后使用正向前查找,最后再反转回来:

function reverseString(str) {
    return str.split('').reverse().join('');
}

const urls = ['https://example.com', 'example.org/http', 'ftp://example.net'];

// 模拟向后查找
const httpEndUrls = urls.filter(url => new RegExp(`^(?=${reverseString('tpir')}:\/\/)`, 'g').test(reverseString(url)));
console.log(httpEndUrls); // 输出: ['example.org/http']

解释

  • 正向前查找 (?=exp):这种正则表达式用于匹配某个位置后面跟着满足条件 exp 的子串。例如,/^(?=http:\/\/|https:\/\/)/ 匹配任何以 “http://” 或 “https://” 开头的字符串。

  • 向后查找 (?<=exp):尽管 JavaScript 的正则表达式不直接支持 (?<=exp),但可以通过一些技巧来实现类似的功能,比如反转字符串或使用捕获组。

注意事项

  • 在较旧的 JavaScript 环境中,可能无法直接使用 (?<=exp),因此需要采用上述方法进行替代。
  • 向后查找在某些环境中(如 Node.js 12 及以下版本)不可用,但在 Node.js 13 及以上版本中可以使用,前提是你的环境支持 ES2018 特性。

我也觉得郁闷, 居然没有.

在Node.js中的JavaScript,正则表达式确实不支持后瞻断言(?<=exp)。但是,你可以通过其他方式实现类似的功能。

示例代码

假设我们想要匹配一个字符串,该字符串后面跟着特定的模式(比如字符串abc后面跟着数字),可以使用如下方法:

const str = "defabc123";
const regex = /abc(\d+)/;

// 使用正向后瞻断言的等效方法
const equivalentRegex = /abc(\d+)/;

// 检查是否匹配
console.log(equivalentRegex.test(str)); // 输出: true

// 获取匹配结果
const match = str.match(equivalentRegex);
if (match) {
    console.log(match[1]); // 输出: "123"
}

解释

  • 正则表达式/abc(\d+)/
    • abc:匹配abc字符串。
    • (\d+):匹配一个或多个数字,并将它们捕获到组中。

在这个例子中,我们实际上实现了类似于(?<=abc)\d+的功能,但使用的是一个简单的正则表达式。

如果你需要使用负向后瞻断言(?<!exp),同样,JavaScript的正则表达式也不支持。你可以通过一些变通的方法来实现相同的效果。例如,如果你想找到不在特定字符串前的情况,可以先过滤掉那些包含该字符串的字符串,然后再进行匹配。

注意

虽然JavaScript的正则表达式不支持后瞻断言,但它提供了许多其他功能来处理复杂的匹配问题。如果遇到复杂的需求,可以通过编写辅助函数或使用其他字符串处理方法来解决。

回到顶部