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 特性。
我也觉得郁闷, 居然没有.