2010-10-06 12 views

risposta

16

Utilizzare un look-behind assertion:

split("(?<!\\\\):") 

Questo corrisponderà solo se non ci sono precedenti \. È richiesto l'utilizzo della doppia escape \\\\ come richiesto per la dichiarazione della stringa e una per l'espressione regolare.

Nota tuttavia che questo non ti consente di scappare i backslash, nel caso in cui desideri consentire a un token di terminare con una barra rovesciata. Per fare questo si dovrà sostituire prima tutti i doppi backslash con

string.replaceAll("\\\\\\\\", ESCAPE_BACKSLASH) 

(dove ESCAPE_BACKSLASH è una stringa che non si verificherà in ingresso) e poi, dopo la scissione con l'affermazione look-dietro, sostituire la stringa ESCAPE_BACKSLASH con un backslash non protetto con

token.replaceAll(ESCAPE_BACKSLASH, "\\\\") 
0

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.

Problemi correlati