2012-03-26 20 views
26

es ist posible determinar la función ("(") que tiene que dividir sólo por la primera cadena encontrada String.split "("Dividir por primera cuerda encontró en Java

Ejemplo:?

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)"] 

Respuesta

48

Sí, por supuesto:

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

Como the documentation for String.split(String,int) explica:

El parámetro limit controla el número de veces que se aplica el patrón y, por lo tanto, afecta la longitud de la matriz resultante . Si el límite de n es mayor que cero entonces el patrón se aplicará en la mayoría de n - 1 veces, longitud de la matriz no será mayor que n, y la última entrada del array contendrá toda la entrada más allá el último delimitador coincidente.

+0

ruakh Probé su respuesta, cuando mis reges es " \\ (", funciona bien pero cuando mi expresión regular es" (", arroja Excepción. ¿Puedes decir por qué? –

+3

@ChandraSekhar: Es porque' ('tiene un significado especial en las expresiones regulares de Java. (Por ejemplo,' 34) + 'significa" una o más apariciones de '34'", en oposición a '34 +' que significa "a' 3', seguido por uno o más ocurrencias de '4'.) Entonces la barra diagonal inversa se usa para" citar "o" escapar ", e indicar" un 'real" ("carácter" en lugar de usar '(' para su significado especial. – ruakh

+0

@ruakh gracias por su respuesta. –

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

Ver javadoc para obtener más información

EDITAR: soporte escapado, según el comentario de Pedro @ a continuación.

+0

Causará Excepción. java.util.regex.PatternSyntaxException: Grupo no cerrado cerca del índice 1 –

2

intento con esta solución, que es genérica, más rápido y más sencillo de utilizar una expresión regular:

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} ; 
} 

Prueba de esta manera:

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

"Simpler"? Para cada uno, supongo. Encuentro que la expresión regular es la más simple y la más rápida. Además, admite cadenas, y no explotará si 'str.indexOf (c) == -1'. – ruakh

+1

Es más simple porque no tiene que saber sobre expresiones regulares para usarlo. Claro, necesita un poco de comprobación de errores, pero eso está más allá de la cuestión. Y si se necesitan cadenas, simplemente cambiando el parámetro 'char c' a' String c' hará el truco. Y sí, es más rápido, su solución necesita compilar y hacer coincidir una expresión regular cada vez que se invoca, y OP tendrá que escapar de los caracteres especiales, que desconoce. –

+0

Re: "Y sí, es más rápido": Bueno, obviamente. No dije que la expresión regular es más rápida, solo que es mucho más rápida y mucho más simple. Re: "simplemente cambiando el parámetro' char c' a 'String c' hará el truco": También tendría que cambiar '1' a' c.length() ' – ruakh

Cuestiones relacionadas