负向后看+非捕获组



(?<!")https://t.me/(c)?/?([+a-zA-Z0-9]+)/?([0-9]*)?

我想找到所有不带引号(")的电报链接,但我不希望主要的负向后看是一个组,我该怎么做?我尝试了以下方法,但没有成功。

这段代码可以工作,但我希望初始的负向后看不创建组

我的步骤:

  • (?:(?<!"))not working,
  • (?<!(?:"))不工作

例子:

  • https://t.me/+AjFb2c8u85UfYrY0->True(1组->+AjFb2c8u85UfYrY0)(非两组)

  • "https://t.me/+AjFb2c8u85UfYrY0->假

代码:

const regex = /(?<!")https://t.me/(c)?/?([+a-zA-Z0-9]+)/?([0-9]*)?/
const text = 'https://t.me/+AjFb2c8u85UfYrY0'
const [fullMatch, ...groups] = text.match(regex);
console.log(groups);

返回[undefined, "+AjFb2c8u85UfYrY0", undefined]

所以你可能认为第一个undefined是因为你消极地回头看,但事实并非如此!第一个undefined(c)?捕获组的结果。

所以如果你用/c/模式捕获url上的组,你会得到:

const regex = /(?<!")https://t.me/(c)?/?([+a-zA-Z0-9]+)/?([0-9]*)?/
const text = 'https://t.me/c/+AjFb2c8u85UfYrY0'
const [fullMatch, ...groups] = text.match(regex);
console.log(groups);

因此,您不需要为最初的负面向后看而不创建group做任何事情。

相关内容

  • 没有找到相关文章

最新更新