gumbo era giusta usando una look-behind assertion, ma nel caso in cui la stringa contiene il carattere di escape escape (ad es \\
) proprio di fronte a una virgola, la scissione potrebbe rompersi. Vedere questo esempio:
test1\,test1,test2\\,test3\\\,test3\\\\,test4
Se fate una semplice spaccatura look-dietro per (?<!\\),
come Gumbo suggerito, la stringa viene diviso in due parti solo test1\,test1
e test2\\,test3\\\,test3\\\\,test4
. Questo perché il look-behind controlla solo un carattere per il carattere di escape. Che cosa sarebbe effettivamente corretto, se la stringa è divisa in virgole e virgole preceduta da un numero pari di caratteri di escape.
per raggiungere questo obiettivo un po 'più complesso (doppio) look-dietro è necessaria espressione:
(?<!(?<![^\\]\\(?:\\{2}){0,10})\\),
Utilizzando questa più complessa espressione regolare in Java, richiede ancora una volta di sfuggire a tutto \
da \\
. Quindi questo dovrebbe essere una risposta più sofisticati alla tua domanda:
"any comma separated string".split("(?<!(?<![^\\\\]\\\\(?:\\\\{2}){0,10})\\\\),");
Nota: Java non supporta infinite ripetizioni all'interno di lookbehinds. Pertanto, solo fino a 10 caratteri di escape doppia ripetuti vengono verificati utilizzando l'espressione {0,10}
. Se necessario, è possibile aumentare questo valore regolando il secondo numero.
È inoltre possibile: 'abc:" def: ghi ": jkl'? –