2012-03-21 14 views
140

Sto provando ad analizzare un file che ha ciascuna linea con valori delimitati da tubo. Non ha funzionato correttamente quando non ho scappato il delimitatore del tubo nel metodo split, ma ha funzionato correttamente dopo che fuggo la pipa come sotto.Perché String.split necessita del delimitatore di pipe per essere sfuggito?

private ArrayList<String> parseLine(String line) { 
    ArrayList<String> list = new ArrayList<String>(); 
    String[] list_str = line.split("\\|"); // note the escape "\\" here 
    System.out.println(list_str.length); 
    System.out.println(line); 
    for(String s:list_str) { 
     list.add(s); 
     System.out.print(s+ "|"); 
    } 
    return list; 
} 

Qualcuno può spiegare perché il carattere pipe deve essere sfuggito per il metodo split()?

+13

Le risposte sotto risposto il "perché", ma appena cronaca, se si sta cercando di abbinare una stringa letterale si potrebbe anche guardare [Pattern.quote] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)). Ci vuole un 'String' e restituisce una espressione regolare' String' che corrisponda all'input (cioè, si prende cura di tutte le operazioni di escape per te). – yshavit

+0

+1 per 'Pattern.quote' – redDevil

risposta

175

String.split prevede un argomento di espressione regolare. Uno | senza caratteri di escape è analizzato come un'espressione regolare che significa "stringa vuota o stringa vuota", che non è ciò che intendi.

76

Perché la sintassi per tale parametro su split è un'espressione regolare, dove nel '|' ha un significato speciale di OR e un '\ |' significa letterale '|' quindi la stringa "\\ |" significa l'espressione regolare '\ |' il che significa che corrisponde esattamente al carattere '|'.

+1

Grazie per questa spiegazione. Quasi sempre dimentico di usare la doppia fuga. Ora che so perché è così, sicuramente mi aiuterà a ricordare d'ora in poi. – sufinawaz

+0

Cosa succede se il valore della linea String ha dei caratteri Pipe? Come saresti in grado di dividere senza scomporre il tubo fuoriuscito \ | ? – AlexandreJ

+0

@AlexandreJ Stai chiedendo come suddividere una linea che assomigli a: 'Alcuni | Delimitato | Testo | Con | An | | Incluso | Tubo | Carico in' ("Alcuni", "Delimitato", "Testo", "Con "," An \ | Embedded "," Pipe "," Char ")'? La funzione split non supporta l'escape in questo modo, ma potresti essere in grado di creare un'espressione regolare che funzionerà per questo caso, come con un aspetto di asserzione negativa a larghezza zero dietro il gruppo: '(? dlamblin

6

Si può semplicemente fare questo:

String[] arrayString = yourString.split("\\|"); 
+0

devi sfuggire \ per usare la tua espressione regolare" yourString.split ("\\ |") "è la formula giusta. – mautrok

Problemi correlati