给定以下正则表达式,其目标是捕获捕获组中项目之前的文本:
/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:25387
TR:CONSIG
我需要知道为什么会这样。
答案 0 :(得分:0)
通过查看Regex101上的正则表达式调试器,您可以看到它们的匹配方式不同。
让我解释每个正则表达式是如何匹配的。
让我们看看第一个正则表达式。该正则表达式cliente:[\sa-z.ñÑ0-9(),']+
的第一部分最初将与此匹配:
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
它停在:
,但它已经走得太远了;它与前瞻不匹配。然后它必须逐个字符地回溯,看它是否能匹配前瞻:
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG ... CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
现在,让我们看看第二个正则表达式。该正则表达式cliente:.+
的第一部分将匹配整行:
<强> 强>
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
当然,这并没有为前瞻留下任何东西,所以它必须逐字逐句地回溯:
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG ... CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
因为你从另一个地方回溯,你会得到不同的结果。这种尽可能匹配的行为是greedy。 另一方面,您可以选择制作lazy:
/cliente:.+?(?=((?:traslado|tr|giro|rut|rt)\:.*))/gmi
这个改变后的正则表达式cliente:.+?
的第一部分最初会尽可能少地匹配:
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG
然后尝试匹配前瞻。此时它无法匹配,因此它会抬起一个字符并尝试再次匹配该前瞻,重复直到它找到某些内容(并返回匹配项)或者没有剩余字符串(并且它失败):
CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387 TR:CONSIG ... CLIENTE:NUBOX S.A.TRASLADO:CONSIGNACIONESRUT:25387TR:CONSIG