为什么正面展望不能作为第一个捕获组工作
Why doesn't positive lookahead work as first capture group?
我正在使用以下正则表达式;
((?:_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]+)(?=:)
- Spring WebFlow2 Javascript只在第一个单选按钮上工作
- JS-颜色选择器只有第一个工作
- 在页面中使用了两次多个图像上传,但第一个正在工作,另一个不起作用
- 为什么只有我的切换列表的第一个案例工作正常
- CKEditor:以小部件作为第一个元素,选择所有在Chrome中不工作的
- 只能使用第一个输入框输入注释.他们不为其余的工作
- 在节点中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺
- 我在一页上有两个简单的javascript幻灯片,但第二个停止了第一个工作
- Javascript在第二个按钮单击而不是第一个按钮上工作
- HTML5 多画布在 chrome 中运行良好,但在 Firefox 的情况下,它只能在第一个画布中工作
- 为什么正面展望不能作为第一个捕获组工作
- jQuery Append 在 HTML 的第一个块上工作正常,但在动态添加的 HTML 上不起作用
- 第一个现实生活-工作JS脚本.我怎样才能使它更有效率
- 引导工具提示不't在与第一个数据表不同的页面中工作
- 角度自定义指令基本输入过滤器工作不正常,只显示匹配的第一个实例
- 两个可滴管的区域第一个只能工作
- 为什么只有第一个正则表达式才能正常工作
- 范围过滤器仅在第一个控制器中工作
- 2个SQL查询.两者独立工作.当我把它们放在一起时,第一个查询的结果变量是空的.为什么?
- 使用jQuery的滑块,第一个工作,但第二个没有't.需要动态元素