【发布时间】:2016-09-23 14:17:37
【问题描述】:
给定以下正则表达式,其目标是捕获捕获组中项目之前的文本:
/cliente:[\sa-z.ñÑ0-9(),']+(?=((?:traslado|tr|giro|rut|rt)\:.*))/gmi
带文字串:
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
并获得成功的结果。但是,如果我在正则表达式中插入一个点,如下所示:
/cliente:.+(?=((?:traslado|tr|giro|rut|rt)\:.*))/gmi
它打破了捕获组,产生了
CLIENTE:NUBOX S.A. TRASLADO:CONSIGNACIONESRUT:25387TR:CONSIG
我需要知道为什么会这样。
【问题讨论】:
-
因为点不匹配换行符,而你的字符类中的 \s 匹配。
-
首先,我鼓励您阅读Greedy vs Non-greedy 问题。 用贪心点加上
.+模式替换旧模式会导致在以下情况下消耗输入字符串的所有字符正则表达式引擎到达.+。因此,通过传递此模式,您可以确定当前光标位于输入行的末尾。对于引擎,所有模式都应该成功匹配,因此它会命中下一个模式,即 + 前瞻结构。在字符串末尾没有traslado、rt或... -
... 其他选择。所以它会回溯(后退一步)到
G之前。然后再次前瞻不匹配。它继续回溯,直到出现在TR之前。 Lookahead 成功并且引擎满足。期间。 -
[\sa-z.ñÑ0-9(),']+和.+之间有趣的区别在于[\sa-z.ñÑ0-9(),']+不匹配冒号:而.+匹配。
标签: regex lookahead capturing-group