Gumbo fue correcta utilizando un look-behind assertion, pero en caso de que su cadena contiene el carácter de escape escapado (por ejemplo \\
) justo en frente de una coma, la división podría romper. Vea este ejemplo:
test1\,test1,test2\\,test3\\\,test3\\\\,test4
Si lo hace un simple vistazo dividida subyacente para (?<!\\),
como se sugiere Gumbo, la cadena se hace dividió en dos partes solamente test1\,test1
y test2\\,test3\\\,test3\\\\,test4
. Esto se debe a que el look-behind simplemente verifica un personaje para el personaje de escape. Lo que realmente sería correcto, si la secuencia se divide en comas y comas precedidas por un número par de caracteres de escape.
Para lograr esto un poco más compleja (doble) mira-detrás es necesaria la expresión:
(?<!(?<![^\\]\\(?:\\{2}){0,10})\\),
El uso de esta expresión regular más complejo en Java, de nuevo requiere para escapar de todo \
por \\
. Por lo que esta debe ser una respuesta más sofisticado a su pregunta:
"any comma separated string".split("(?<!(?<![^\\\\]\\\\(?:\\\\{2}){0,10})\\\\),");
Nota: Java no soporta repeticiones infinitas dentro de lookbehinds. Por lo tanto, solo se verifican hasta 10 caracteres de repetición de escape doble utilizando la expresión {0,10}
. Si es necesario, puede aumentar este valor ajustando el último número.
También es posible lo siguiente: 'abc:" def: ghi ": jkl'? –