¿Cómo dividir String con algún separador pero sin eliminar ese separador en Java?

Estoy enfrentando un problema al dividir String .

Quiero dividir una String con un separador pero sin perder ese separador.

Cuando usamos el somestring.split(String separator) en Java, divide la String pero elimina la parte del separador de String . No quiero que esto suceda.

Quiero el resultado como a continuación:

 String string1="Ram-sita-laxman"; String seperator="-"; string1.split(seperator); 

Salida:

 [Ram, sita, laxman] 

pero quiero el resultado como el siguiente:

 [Ram, -sita, -laxman] 

¿Hay alguna manera de obtener resultados como este?

 string1.split("(?=-)"); 

Esto funciona porque split realmente toma una expresión regular . Lo que realmente está viendo es un “lookahead positivo de ancho cero”.

Me encantaría explicar más, pero mi hija quiere jugar al té. 🙂

Editar: ¡Atrás!

Para explicar esto, primero te mostraré una operación split diferente:

 "Ram-sita-laxman".split(""); 

Esto divide su cadena en cada cadena de longitud cero. Hay una cadena de longitud cero entre cada personaje. Por lo tanto, el resultado es:

 ["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"] 

Ahora, modifico mi expresión regular ( "" ) para que solo coincida con las cadenas de longitud cero si van seguidas de un guión .

 "Ram-sita-laxman".split("(?=-)"); ["Ram", "-sita", "-laxman"] 

En ese ejemplo,? ?= Significa “mirar hacia adelante”. Más específicamente, significa “mirada positiva “. ¿Por qué lo “positivo”? Porque también puedes tener un lookahead negativo ( ?! ) Que se dividirá en cada cadena de longitud cero que no esté seguida por un guion:

 "Ram-sita-laxman".split("(?!-)"); ["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"] 

También puede tener lookbehind positivo ( ?<= ) Que se dividirá en cada cadena de longitud cero precedida por un guión:

 "Ram-sita-laxman".split("(?<=-)"); ["Ram-", "sita-", "laxman"] 

Finalmente, también puede tener lookbehind negativo ( ? ) Que se dividirá en cada cadena de longitud cero que no esté precedida por un guión:

 "Ram-sita-laxman".split("(? 

Estas cuatro expresiones se conocen colectivamente como las expresiones de vistazo .

Bono: poniéndolos juntos

Solo quería mostrar un ejemplo que encontré recientemente que combina dos de las expresiones alternativas. Supongamos que desea dividir un identificador de CapitalCase en sus tokens:

 "MyAwesomeClass" => ["My", "Awesome", "Class"] 

Puedes lograr esto usando esta expresión regular:

 "MyAwesomeClass".split("(?<=[az])(?=[AZ])"); 

Esto se divide en cada cadena de longitud cero precedida por una letra minúscula ( (?<=[az]) ) y seguida por una letra mayúscula ( (?=[AZ]) ).

Esta técnica también funciona con los identificadores camelCase.

Es un poco dudoso, pero podría introducir un separador falso usando una función de reemplazo. No conozco los métodos de Java, pero en C # podría ser algo así como:

 string1.Replace("-", "#-").Split("#"); 

Por supuesto, necesitarás elegir un separador ficticio que garantice que no estará en ninguna otra parte de la cadena.

Una forma de hacerlo es dividir su cadena, luego agregue su separador al principio de cada cadena extraída excepto la primera.

 seperator="-"; String[] splitstrings = string1.split(seperator); for(int i=1; i 

ese es el código que se ajusta a la respuesta de LadaRaider.

¡Adam golpeó el clavo en la cabeza! Utilicé su respuesta para descubrir cómo insertar texto de nombre de archivo desde el navegador de diálogo de archivos en un cuadro de texto enriquecido. El problema que encontré fue cuando estaba agregando una nueva línea en la “\” en la cadena del archivo. El comando string.split se estaba dividiendo en \ y eliminándolo. Después de usar una mezcla del código de Adam, pude crear una nueva línea después de cada \ en el nombre del archivo.

Aquí está el código que utilicé:

 OpenFileDialog fd = new OpenFileDialog(); fd.Multiselect = true; fd.ShowDialog(); foreach (string filename in fd.FileNames) { string currentfiles = uxFiles.Text; string value = "\r\n" + filename; //This line allows the Regex command to split after each \ in the filename. string[] lines = Regex.Split(value, @"(?<=\\)"); foreach (string line in lines) { uxFiles.Text = uxFiles.Text + line + "\r\n"; } } 

¡Disfrutar!

Walrusking