2012-03-26 11 views
26

è ist possibile dire (funzione "(") che deve dividere solo la prima stringa trovata String.split "("Split dapprima trovato String in Java

Esempio:?

String test = "A*B(A+B)+A*(A+B)"; 
test.split("(") should result to ["A*B" ,"A+B)+A*(A+B)"] 
test.split(")") should result to ["A*B(A+B" ,"+A*(A+B)"] 

risposta

48

Sì, assolutamente:

test.split("\\(", 2); 

Come the documentation for String.split(String,int) spiega:

Il parametro limit controlla il numero di volte in cui viene applicato il motivo e pertanto influisce sulla lunghezza dell'array risultante. Se il limite n è maggiore di zero, allora il modello sarà applicata al massimo n - 1 volte, lunghezza dell'array sarà non superiore n, e all'ultimo dell'array conterrà tutti gli input oltre l'ultimo delimitatore abbinato.

+0

ruakh ho provato la vostra risposta, quando i miei reges è " \\ (", funziona bene ma quando la mia regex è" (", genera Eccezione, puoi dire perché? –

+3

@ChandraSekhar: È perché' ('ha un significato speciale nelle espressioni regolari di Java. (Ad esempio,' (34) + "significa" una o più occorrenze di '34'", al contrario di '34 +' che significa "a' 3', seguito da uno o più occorrenze di '4'.) Quindi il backslash è usato per" quotare "o" scappare ", e indicare" un vero '(' carattere 'piuttosto che usare '(' per il suo significato speciale. – ruakh

+0

@ruakh grazie per la tua risposta. –

4
test.split("\\(",2); 

Vedi javadoc per ulteriori informazioni

EDIT: Fuggito staffa, come da @ commento di Pedro qui sotto.

+0

causerà eccezione. java.util.regex.PatternSyntaxException: gruppo non chiuso vicino all'indice 1 –

2

Prova con questa soluzione, è generica, più veloce e più semplice rispetto all'utilizzo di un'espressione regolare:

public static String[] splitOnFirst(String str, char c) { 
    int idx = str.indexOf(c); 
    String head = str.substring(0, idx); 
    String tail = str.substring(idx + 1); 
    return new String[] { head, tail} ; 
} 

prova in questo modo:

String test = "A*B(A+B)+A*(A+B)"; 
System.out.println(Arrays.toString(splitOnFirst(test, '('))); 
System.out.println(Arrays.toString(splitOnFirst(test, ')'))); 
+2

"Più semplice"? A ciascuno il suo, immagino. Trovo che la regex sia la più semplice e molto veloce. Inoltre, supporta le stringhe e non esploderà se 'str.indexOf (c) == -1'. – ruakh

+1

È più semplice perché non è necessario conoscere le espressioni regolari per usarlo. Certo, ha bisogno di un po 'di controllo degli errori, ma questo è oltre la domanda. E se le stringhe sono necessarie, semplicemente cambiando il parametro 'char c' in' String c' farà il trucco. E sì, è più veloce, la tua soluzione ha bisogno di compilare e abbinare un'espressione regolare ogni volta che viene invocata, e OP avrà bisogno di sfuggire a caratteri speciali, di cui non è a conoscenza. –

+0

Ri: "E sì, è più veloce": Beh, ovviamente. Non ho detto che la regex è più veloce, solo che è molto veloce e molto più semplice. Ri: "cambiare semplicemente il parametro' char c' in 'String c' farà il trucco": Dovresti anche cambiare '1' in' c.length() '. – ruakh