为什么正面展望不能作为第一个捕获组工作

Why doesn't positive lookahead work as first capture group?

本文关键字:第一个 工作 不能 为什么      更新时间:2023-09-26

我正在使用以下正则表达式;

((?:_missing_:|_exists_:)[a-z0-9]+)|(([a-z0-9]+)(?=:))

匹配 lucene 查询字符串;

_missing_:title age:(>=10 AND < 20) AND age:123 AND _exists_:title123

第一个非捕获组不受尊重,返回_missing_:title而不是title。使用积极的前瞻会使整个正则表达式无法匹配任何内容。

它应该返回以下数组;

['title', 'age', 'age', 'title123']

像下面这样更改您的正则表达式,然后从组索引 1 和 2 中获取所需的字符串。

(?:_missing_:|_exists_:)([a-z1-9]+)|([a-z1-9]+)(?=:)

无需将非捕获组(?:_missing_:|_exists_:)包含在捕获组中。这就是返回missing:title而不是title的原因。而且捕获[a-z1-9]+组就足够了。

演示

你想要的

不是前瞻,而是后瞻: (?<=)

/(?<=_missing_:|_exists_:)([a-z0-9]+)|([a-z0-9]+)(?=:)/

测试。

现在,只有当后面有_missing_:_exists_:时,([a-z0-9]+)才会匹配,但这些都不是匹配的一部分。

拳头非捕获组受到尊重,当你这样做时:/((?:_missing_:|_exists_:)[a-z0-9]+)/第一组跨越整个事情_missing_:title,第二组是_missing_:但未捕获,并且title不属于任何组。

但是,即使未捕获,它仍然是匹配的,类似于 /(_missing_:[a-z0-9]+)/ .你想要的是捕获title,所以你需要把它放在一个组()/((?:_missing_:|_exists_:)([a-z0-9]+))/ 中。现在您有三个组:_missing_:title_missing_:(未捕获)和 title

你可以使外部组不捕获:/(?:(?:_missing_:|_exists_:)([a-z0-9]+))/,但没有必要,因为你实际上并没有使用它,所以只需删除它:

/(?:_missing_:|_exists_:)([a-z0-9]+)/

现在第一组是title.但是,它仍然是比赛的一部分,这似乎不是您想要的。

要将其从匹配中删除,您需要积极的回溯:

/(?<=_missing_:|_exists_:)([a-z0-9]+)/

另外,由于您在第二部分中使用了积极的前瞻,因此没有必要将其放在外部组中,因此只需:

([a-z0-9]+)(?=:)
相关文章: