¿Cómo dividir una cadena que tiene diferentes valores con múltiples delimitadores?

¿Podría alguien darme sugerencias para una expresión regular para lo siguiente?

Ejemplo: city^chennai|country^India~TamilNadu|pincode^600034

Las cadenas delimitadas esperadas son:

city
chennai
country
India,TamilNadu
pincode
600034

Nota: ~ debe convertirse en ,

preguntado el 04 de julio de 12 a las 06:07

no puedes usar YOUR_STRING_VARIBLE.replace("^"," ").replace("|"," ").replace("~",",") -

4 Respuestas

Simplemente divida en caracteres que no sean palabras (excluyendo la coma) después de reemplazar el ~ con una coma:

input.replaceAll("~",",").split("[^\\w,]");

luego (según el comentario que requiere un mapa) itere sobre la matriz resultante en pares, agregando las entradas del mapa.

Aquí hay un código de prueba:

public static void main( String[] args ) {
    String input = "city^chennai|country^India~TamilNadu|pincode^600034";
    String[] things = input.replaceAll( "~", "," ).split( "[^\\w,]" );
    Map<String, String> map = new HashMap<String, String>( );
    for (int i = 0; i < things.length; i+=2) {
        map.put(things[i], things[i+1]);
    }
    System.out.println( map );
}

Salida:

{pincode=600034, country=India,TamilNadu, city=chennai}

Respondido 04 Jul 12, 07:07

Olvidé agregar un punto aquí ... necesito guardarlos como clave, valor - Mapa . - Kathir

No pude ver la respuesta editada para Map ..es el problema de actualización del navegador? - Kathir

también puede usar la abreviatura para la entrada de caracteres que no son palabras.replaceAll("~",",").split("[\\W,]"); - Bagira

@Bala: No, el significado será diferente. His significa cualquiera excepto (carácter de palabra y coma). Tuyo significa (cualquiera excepto el carácter de palabra) y coma, que significa cualquiera excepto el carácter de palabra. - nhahtdh

Puedes usar esto:

.replaceAll("~", ",").split("[|^]")

Suponga que la cadena se divide correctamente, puede agruparlos en un par de nombre-valor asignando la cadena en el índice 2k al índice (2k + 1)

Respondido 04 Jul 12, 07:07

puedes usar StringTokenizer class aquí para dividir una cadena con diferentes delimitadores. Utilizar hasNextToken("delimiterHereAsString") método para especificar diferentes delimitadores con los que desea dividir.

este enlace te puede ayudar. http://www.java-examples.com/java-stringtokenizer---specify-delimiter-example

Respondido 04 Jul 12, 07:07

((w+)[|^~])*(w+)

Editar: ahora me di cuenta de que es como un mapa, así que tal vez:

((w+)^(w+)|)*(w+)^(w+)

Reemplace w+ con una clase personalizada en [...] para que ~ también funcione.

Pattern p = Pattern.compile("((w+)^(w+)|)*(w+)^(w+)");
 Matcher m = p.matcher("city^chennai|country^India~TamilNadu|pincode^600034");
 if( m.matches() ){
     for( int i = 1; i < m.groupCount(); i+=2 ) {
         // m.group(i) and m.group(i+1) gives you the values.
     }
 }

Si quieres la forma más fácil, usa Pattern#split("")

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#split%28java.lang.CharSequence%29

Respondido 04 Jul 12, 14:07

sería muy útil si pudiera agregar una pequeña parte del fragmento de código. - Kathir

¿Podría pegar el fragmento de código para comprender mejor su enfoque? - Kathir

Depende de lo que realmente quieras hacer: ¿convertir a una cadena diferente? Luego usa expresiones regulares. ¿O dividir y usar en Java? Entonces tal vez use el otro enfoque que sugerí. - Ondra Zižka

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.