(?<!")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做任何事情。