2011-12-17 19 views
5

estoy tratando de romper una colección muy simple de cadenas que vienen en las formas dedivisión de cadenas a base de un delimitador

0|0 
10|15 
30|55 

etc etc. Esencialmente números que están separados por tuberías.

Cuando uso la función de división de cadenas de java con .split ("|"). Obtengo resultados algo impredecibles. espacio en blanco en la primera ranura, a veces el número en sí no está donde pensé que debería estar.

¿Alguien puede ayudarme y darme consejos sobre cómo puedo usar un reg exp para guardar SÓLO los enteros?

Me pidieron que diera el código tratando de hacer la división real. Así que me permite hacer que la esperanza de aclarar aún más mi problema :)

String temp = "0|0"; 
String splitString = temp.split("|"); 

resultados

\n 
0 
| 
0 

que estoy tratando de conseguir

0 
0 
única

. Siempre agradecido por cualquier ayuda antes de tiempo :)

+0

Uso de' .split' va a ser la forma más fácil, si siempre están delimitados por algo tan simple como una tubería. En lugar de intentar hacer esto con expresiones regulares, ¿puedes publicar el código que has escrito que intenta hacer la división junto con la salida (no solo describas la salida, muéstranos el resultado) , para que podamos ver lo que está pasando? – jefflunt

+0

Publicar un código. Idealmente, un ejemplo mínimo que demuestra el problema. – crazyscot

+0

He publicado las dos líneas de código que me están dando el problema. Gracias por recordarme que lo publique. –

Respuesta

7

todavía mejor utilizar split(), se salta fichas nulos por defecto. desea deshacerse de los caracteres no numéricos de la cadena y solo mantener las tuberías y los números, entonces puede usar fácilmente split() para obtener lo que desea. o puede pasar múltiples delimitadores para dividir (en forma de expresiones regulares) y esto debería funcionar:

String[] splited = yourString.split("[\\|\\s]+"); 

y la expresión regular:

import java.util.regex.*; 

Pattern pattern = Pattern.compile("\\d+(?=([\\|\\s\\r\\n]))"); 
Matcher matcher = pattern.matcher(yourString); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+0

esto es realmente lo contrario de lo que me gustaría hacer ¡jaja! Además, al poner este reg ex en mi java ide (red beans) me da un error de carácter de escape ilegal (ni siquiera sabía que se podía obtener este error dentro de una cadena ...). ¿Puedes decirme cómo guardar solo los enteros? –

+0

@SelcukBor oops, olvidé escapar de las barras diagonales inversas. (el problema de publicar código sin pruebas). Editado mi respuesta. – fardjad

+0

esto hizo el truco:) !!! Muchas gracias por salvarme en esta hora oscura. Además, como se comentó en otra respuesta, parece que necesitamos dos personajes de escape. Por lo tanto, debe dividirse. ("[\\ | \\ s] +"); –

4

Puede reemplazar el espacio en blanco para las tuberías y dividirlo.

String test = "0|0 10|15 30|55"; 
test = test.replace(" ", "|"); 
String[] result = test.split("|"); 

Esperanza esto ayuda para usted ..

+0

como arriba , pero si necesita mantenerlos en pares use un diff erent char, p. Prueba de cadena = "0: 0 | 10: 15 | 30: 55"; luego crea un ciclo para ir a través de los pares y divídelos en tu nueva matriz – Ozzy

+0

, sí, buena observación –

0

Esto debería funcionar para usted:

([0-9]+) 
+0

¿Esto elimina los enteros? Me gustaría mantener solo ellos XD! –

+0

Usted usaría esto en 'Pattern.compile()' si quisiera usar una expresión regular para unir los dígitos de una cadena. – crazyscot

2

La tubería ('|') es un carácter especial en regular expressions . Necesita ser "escapado" con un carácter "\" si desea usarlo como un personaje normal, desafortunadamente "\" es un personaje especial en Java, por lo que debe realizar una especie de maniobra de escape doble, p.

String temp = "0|0"; 
String[] splitStrings = temp.split("\\|"); 
6

El símbolo de la tubería es especial en una expresión regular (marca alternativas), necesita escapar de ella. Dependiendo de la versión de Java que esté utilizando, esto podría explicar sus resultados impredecibles.

class t { 
    public static void main(String[]_) 
    { 
     String temp = "0|0"; 
     String[] splitString = temp.split("\\|"); 

     for (int i=0; i<splitString.length; i++) 
      System.out.println("splitString["+i+"] is " + splitString[i]); 
    }  
} 

salidas

splitString[0] is 0 
splitString[1] is 0 

Tenga en cuenta que una barra invertida es el carácter de escape expresión regular, pero debido a una barra invertida es también el carácter de escape en fuente de Java se necesitan dos de ellos para empujar la barra invertida en la expresión regular.

+0

muy útil para conocer los símbolos especiales. Ayudó a resolver el problema en gran medida. Gracias por su aporte :) –

2

La biblioteca Guava tiene una buena clase Splitter que es una alternativa mucho más conveniente que String.split(). Las ventajas son que puede elegir dividir la cadena en caracteres específicos (como '|'), o en cadenas específicas, o con expresiones regulares, y puede elegir qué hacer con las partes resultantes (recortarlas, tirar entre piezas vacías, etc. .).

Por ejemplo, puede llamar

Iterable<String> parts = Spliter.on('|').trimResults().omitEmptyStrings().split("0|0") 
+0

mientras aprecio el aviso no estoy deseoso de intentar y obtener una biblioteca de terceros dentro del proyecto jaja!Las cosas son lo suficientemente difíciles de recoger como lo es ahora. Voy a reservar marcar esto para uso futuro. –

+1

Puedo entender esto, pero tenga la seguridad de que Guava es una biblioteca muy útil que hace que la programación en Java sea mucho más conveniente en muchos casos. Por lo tanto, definitivamente debe echarle un vistazo cuando tenga tiempo libre. –

+0

Piensa en Guava en la misma categoría que Apache Commons. Proporciona algunas funcionalidades básicas realmente útiles. –

3

Usted puede utilizar StringTokenizer.

String test = "0|0"; 
StringTokenizer st = new StringTokenizer(test); 
int firstNumber = Integer.parseInt(st.nextToken()); //will parse out the first number 
int secondNumber = Integer.parseInt(st.nextToken()); //will parse out the second number 

Por supuesto, siempre puede anidar esto dentro de un ciclo while si tiene varias cadenas.

Además, necesita importar java.util. * Para que esto funcione.

0

Considerando un escenario en el que hemos leído una línea del archivo csv o xls en forma de cadena y necesitamos separar las columnas en una matriz de cadena según los delimitadores.

A continuación se muestra el fragmento de código para lograr este problema ..

  
    { ... 
    .... 
    String line = new BufferedReader(new FileReader("your file")); 
    String[] splittedString = StringSplitToArray(stringLine,"\""); 
    ... 
    .... 
    } 
    public static String[] StringSplitToArray(String stringToSplit, String delimiter) 
    { 
     StringBuffer token = new StringBuffer(); 
     Vector tokens = new Vector(); 
     char[] chars = stringToSplit.toCharArray(); 
     for (int i=0; i 0) { 
       tokens.addElement(token.toString()); 
       token.setLength(0); 
       i++; 
     } 
     } else { 
       token.append(chars[i]); 
      } 
     } 
     if (token.length() > 0) { 
      tokens.addElement(token.toString()); 
     } 
     // convert the vector into an array 
     String[] preparedArray = new String[tokens.size()]; 
     for (int i=0; i < preparedArray.length; i++) { 
      preparedArray[i] = (String)tokens.elementAt(i); 
     } 
     return preparedArray; 
    } 

Por encima de fragmento de código contiene método de llamada a StringSplitToArray donde en el método convierte la línea de referencia en la matriz de cadenas dividir la línea en función del delimitador especificado o pasado al método. Delimitador puede ser separador de coma (,) o código dobles (")

Para más información sobre esto, siga este link:. http://scrapillars.blogspot.in

Cuestiones relacionadas