Use String.split () con múltiples delimitadores

201

Necesito dividir una base de cadena en delimitador -y .. Debajo están mis resultados deseados.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

pero mi siguiente código no funciona.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}
Thang Pham
fuente
Según lo que dijo, parece que funciona bien. ¿Cuál es su salida deseada?
Jeff
2
@Jeff: Mostró su producción deseada ( AA/ BB/ CC...)
TJ Crowder
2
¿Estás seguro? Interpreté eso como su salida actual, no como su salida deseada. Tal vez es hora de ponerse de pie y caminar un poco.
Jeff
@Jeff: Perdón por la confusión, actualicé mi publicación para aclarar su malentendido.
Thang Pham
Regex degradará su rendimiento. Recomendaría escribir un método que irá carácter por carácter y dividirá la cadena si es necesario. Puede optimizar esto más para obtener el rendimiento de log (n).
Princesh

Respuestas:

311

Creo que debe incluir el operador regex OR :

String[]tokens = pdfName.split("-|\\.");

Lo que tenga coincidirá:
[DASH seguido de DOT juntos] -.
no
[DASH o DOT ninguno de ellos] -o.

Richard H
fuente
9
¿Por qué requerimos dos barras invertidas?
pjain
77
El .carácter en regex significa cualquier carácter que no sea una nueva línea. tutorialspoint.com/java/java_regular_expressions.htm En este caso, sin embargo, querían el personaje real .. Las dos barras invertidas indican a qué se refiere .. La barra invertida es un personaje de escape.
Monkeygrinder
2
para casos normales sería .split("match1|match2"), (por ejemplo split("https|http")), \\ es escapar del char especial .en el caso anterior
prayagupd
o en general, puede usar la pdfName.split("\\W");siguiente respuesta de @Peter Knego
ahmednabil88
1
usar en [-.]lugar de-|\\.
Saeed
49

Prueba esta expresión regular "[-.]+". El + después trata los caracteres delimitadores consecutivos como uno. Elimina plus si no quieres esto.

Peter Knego
fuente
8
@Lurkers: La única razón por la que Peter no tuvo que escapar -fue porque fue lo primero que pensó en el interior [], de lo contrario, tendría que haber una barra invertida frente a ella (y, por supuesto, para poner una barra invertida frente a ella, nosotros necesita dos porque este es un literal de cadena).
TJ Crowder
Creo que esta respuesta es mejor que la aceptada, porque cuando usa el operador lógico, el problema es que uno de sus delimitadores puede ser parte de sus 'tokens' de resultados. Esto no sucederá con el [-.] +
Jack '
26

Puede usar la expresión regular "\ W". Esto coincide con cualquier carácter que no sea de palabra. La línea requerida sería:

String[] tokens=pdfName.split("\\W");
Varun Gangal
fuente
no funciona para mí `String s =" id (INT), name (STRING), ". El uso de \\ W aquí crea una matriz de longitud 6 donde, como debería ser solo 4
user3527975
2
Esto también se interrumpirá cuando la entrada contenga caracteres Unicode. Es mejor incluir solo el delimitador real, en lugar de un "agarrar todo" con \W.
nhahtdh
13

La cadena que da splites la forma de cadena de una expresión regular, por lo que:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Eso significa dividirse en cualquier personaje en el [](tenemos que escapar -con una barra invertida porque es especial por dentro []; y, por supuesto, tenemos que escapar de la barra invertida porque esta es una cadena). (Por el contrario, .normalmente es especial pero no es especial por dentro []).

TJ Crowder
fuente
No necesita escapar del guión en este caso, porque [-.]no podría interpretarse como un rango.
Alan Moore
1
@ Alan: Debido a que es lo primero en la clase, eso es bastante cierto. Pero siempre lo hago, es demasiado fácil volver más tarde y agregar algo delante sin pensar. Escapar no cuesta nada, así que ...
TJ Crowder
¿Sabes cómo escapar de los corchetes? Tengo la cadena "[200] Ingeniería" que quiero dividir en "200", "Ingeniería"
scottysseus
3
Oh wow, lo tengo ... Tuve que usar dos barras invertidas en lugar de una. String[] strings = codes.get(x).split("\\[|\\]| ");<- código para todos los interesados
scottysseus
13

Usando Guava puedes hacer esto:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);
ColinD
fuente
4

Para dos secuencias de caracteres como delimitadores "AND" y "OR", esto debería funcionar. No olvide cortar durante el uso.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Resultado: ciudades = {"ESTAMBUL", "NUEVA YORK", "PARÍS", "TOKIO", "MOSCÚ"}

ÖMER TAŞCI
fuente
¿Cómo puedo obtener resultados como {"ESTAMBUL Y", "NUEVA YORK Y", "PARÍS O", "TOKIO Y", "MOSCÚ"}
Ahamadullah Saikat
3

Yo usaría Apache Commons:

importar org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Se dividirá en cualquiera de los separadores especificados, a diferencia de los StringUtils.splitByWholeSeparator(str, separator)que usan la cadena completa como separador

Edd
fuente
3
String[] token=s.split("[.-]");
Nitish
fuente
9
Ayude a combatir el malentendido de que StackOverflow es un servicio gratuito de escritura de código, al aumentar su respuesta de solo código con alguna explicación.
Yunnosch
2

Es mejor usar algo como esto:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

He agregado algunos otros personajes como muestra. Esta es la forma más segura de usar, porque la forma .y el 'tratamiento.

Pritam Banerjee
fuente
1

También puede especificar la expresión regular como argumento en el método split () ... vea el siguiente ejemplo ...

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}
Avdhesh Yadav
fuente
1

Prueba este código:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);
segador
fuente
1
Ayude a combatir el malentendido de que StackOverflow es un servicio gratuito de escritura de código, al aumentar su respuesta de solo código con alguna explicación.
Yunnosch
0
s.trim().split("[\\W]+") 

Deberia trabajar.

sss
fuente
2
Primero, no, no funciona, ¿tal vez puedas probarlo antes de publicar? Entonces esta respuesta es la misma que tu, pero funciona. Finalmente, debe verificar su formateo ( debería funcionar ).
Arount
1
Ayude a combatir el malentendido de que StackOverflow es un servicio gratuito de escritura de código, al aumentar su respuesta de solo código con alguna explicación.
Yunnosch
-1

Si sabe que la picadura siempre estará en el mismo formato, primero divida la cadena según .y almacene la cadena en el primer índice en una variable. Luego, divida la cadena en el segundo índice según -y almacene los índices 0, 1 y 2. Finalmente, divida el índice 2 de la matriz anterior en función de .y debería haber obtenido todos los campos relevantes.

Consulte el siguiente fragmento:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...
isometrik
fuente
66
Se puede hacer en un solo paso, así que hazlo en un solo paso. Ver las otras respuestas.
Kaj
2
pdfName.split(".")da como resultado una matriz de longitud cero.
Alan Moore
1) .Necesita ser escapado como\\.
Shri