2012-01-15 22 views
18

Tengo una cadena decir 123dance456 que necesito dividir en dos cadenas que contienen la primera subcadena antes de la subcadena dance (es decir, 123) y después de la sub-cadena cadena dance (es decir, 456). Necesito encontrarlos y mantenerlos en variables de cadena separadas, digamos String firstSubString = 123; y String secondSubString = 456;.cómo encontrar antes y después de la subcadena en una cadena

¿Hay algún método de Cadena que hace exactamente eso?

+0

Se puede hacer, pero ¿cuál es el formato exacto ??? Quiero decir, ¿la danza va a estar ahí siempre? –

+0

@ dku.rajkumar: Sí, la subcadena "dance" siempre estará allí. 'split()' debería hacer el truco. Debería haber imaginado un método como este ya. Pensé que podría tener que escribir una expresión regular para eso.Gracias :) – skip

+0

entonces no hay necesidad de expresiones regulares, simplemente haga uso de String [] str =; string.split ("dance"); como se menciona respuestas –

Respuesta

39

Puede usar String.split(String regex). Sólo hacer algo como esto:

String s = "123dance456"; 
String[] split = s.split("dance"); 
String firstSubString = split[0]; 
String secondSubString = split[1]; 

Tenga en cuenta que si "dance" aparece más de una vez en la cadena original, split() se repartirán en cada caso - por eso el valor de retorno es una matriz.

16

Usted puede hacer esto:

String str = "123dance456"; 
String substr = "dance"; 
String before = str.substring(0, str.indexOf(substr)); 
String after = str.substring(str.indexOf(substr) + substr.length()); 

O

String str = "123dance456"; 
String substr = "dance"; 
String[] parts = str.split(substr); 
String before = parts[0]; 
String after = parts[1]; 

Es de destacar que la segunda respuesta no funcionar si tenemos más de una ocurrencia de la subcadena. A tal fin, si sólo queremos el primero en ser reconocido, que sería más seguro para llamar dividida con un límite:

String[] parts = str.split(substr, 2); 

que asegura que la matriz devuelta tiene como máximo dos elementos. Además, dado que split interpretará su entrada como una expresión regular, debemos tener cuidado con la sintaxis de expresiones regulares no válidas. Como tal, prefiero la primera solución, ya que funciona independientemente de la composición de la subcadena original.

Para hacer la primera respuesta más eficiente - ya que es mi respuesta preferida - entonces, tendríamos que recordar la posición de la subcadena:

final int position = str.indexOf(substr); 
if (position >= 0) { 
    //if the substring does occur within the string, set the values accordingly 
    before = str.substring(0, position); 
    after = str.substring(position + substr.length()); 
} else { 
    //otherwise, default to the empty string (or some other value) 
    before = ""; 
    after = ""; 
} 

Siempre vale la pena prestar atención a estos pequeños cajas de borde.

+0

'parts' sería un' String [] ' –

+0

¿No dividiría devolver una matriz? –

+0

Sí, eso sería malo. –

1
String[] data = new String("123dance456").split("dance"); 
4

Lo más fácil es utilizar el método split como sugieren las otras respuestas. También puede utilizar un Matcher y una Pattern de un enfoque más general:

String str = "123dance456"; 
String splitter = "dance"; 
Pattern p = Pattern.compile("(.*?)" + splitter + "(.*)"); 
Matcher m = p.matcher(str); 
if (m.matches()) { 
    firstSubString = m.group(1); // may be empty 
    secondSubString = m.group(2); // may be empty 
} else { 
    // splitter not found in str 
} 
4

Si está utilizando commons-lang ver StringUtils.substringAfter()

0

Uso del escáner es una buena alternativa:

Scanner scanner = new Scanner("123dance456").useDelimiter("dance"); 
if (scanner.hasNext()) 
    System.out.println(scanner.next()); 
if (scanner.hasNext()) 
    System.out.println(scanner.next()); 

Es muy conveniente procesar los tokens como una secuencia y simplemente preguntar por hasNext() si hay nuevos tokens disponibles. También se obtiene buenas conversiones desde el Scanner, aunque localizada, como:

Scanner scanner = new Scanner("123dance456").useDelimiter("dance"); 
System.out.println(scanner.nextDouble() * scanner.nextDouble()); 
Cuestiones relacionadas