2011-12-17 22 views
5

Sto cercando di spezzare una semplice raccolta di stringhe che vengono nelle forme diDividere stringhe in base a un delimitatore

0|0 
10|15 
30|55 

ecc ecc In sostanza numeri che sono separati da tubi.

Quando uso la funzione di divisione delle stringhe di java con .split ("|"). Ottengo risultati un po 'imprevedibili. spazio bianco nel primo slot, a volte il numero stesso non è dove pensavo dovesse essere.

Qualcuno può aiutarmi e darmi consigli su come utilizzare un reg exp per conservare SOLO gli interi?

Mi è stato chiesto di fornire il codice cercando di eseguire la divisione effettiva. Quindi, mi permetta di farlo nella speranza di chiarire ulteriormente il mio problema :)

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

risultati

\n 
0 
| 
0 

Sto cercando di ottenere

0 
0 
solo

. Sempre grato per qualsiasi aiuto in anticipo :)

+0

Usando' .split' sta per essere il modo più semplice, se sono sempre delimitati da qualcosa di semplice come un pipe: invece di provare a farlo con regex, puoi pubblicare il codice che hai scritto che prova a fare lo split insieme all'output (non limitarti a descrivere l'output, mostraci l'output) , quindi possiamo vedere cosa sta succedendo – jefflunt

+0

Inviare un po 'di codice. Idealmente un esempio minimo che dimostra il problema – crazyscot

+0

Ho pubblicato le due righe di codice che mi sta dando il problema.Grazie per avermi ricordato di postarlo. –

risposta

7

ho ancora suggeriscono di usare split(), salta gettoni nulli per difetto. vuoi liberarti dei caratteri non numerici nella stringa e mantieni solo pipe e numeri, quindi puoi facilmente usare split() per ottenere quello che vuoi. oppure si può passare più delimitatori per dividere (in forma di espressioni regolari) e questo dovrebbe funzionare:

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

e la regex:

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

questo è in realtà l'opposto di quello che mi piacerebbe fare haha! Aggiungendo inoltre questo reg ex nel mio java ide (net bean) mi dà un errore di escape del carattere (non sapevo nemmeno che si potesse ottenere questo errore all'interno di una stringa ...). Puoi dirmi come mantenere solo i numeri interi? –

+0

@SelcukBor oops, ho dimenticato di scappare dalle barre rovesciate. (il problema di pubblicare il codice senza test). Modificato la mia risposta. – fardjad

+0

questo ha fatto il trucco:) !!! Grazie mille per avermi salvato in quest'ora buia. Inoltre, come commentato in un'altra risposta, sembra che avessimo bisogno di due caratteri di escape. Quindi dovrebbe essere diviso. ("[\\ | \\ s] +"); –

4

Si può fare sostituire lo spazio bianco per i tubi e dividerlo.

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

Spero che questo aiuti per voi ..

+0

come sopra , ma se hai bisogno di tenerli in coppia usa una diff erent char ad es. String test = "0: 0 | 10: 15 | 30: 55"; quindi crea un ciclo per passare le coppie e dividerle nel tuo nuovo array – Ozzy

+0

sì, bella osservazione –

0

Questo dovrebbe funzionare per voi:

([0-9]+) 
+0

questo si sbarazza degli interi? Mi piacerebbe tenere solo loro XD! –

+0

Dovresti usarlo in 'Pattern.compile()' se vuoi usare un'espressione regolare per abbinare le cifre di una stringa. – crazyscot

2

Il tubo ('|') è un carattere speciale in regular expressions . Deve essere "sfuggito" con un carattere "\" se si desidera usarlo come carattere normale, sfortunatamente "\" è un carattere speciale in Java, quindi è necessario eseguire una sorta di doppia manovra di fuga, ad es.

6

Il simbolo del tubo è speciale in un'espressione regolare (contrassegna le alternative), è necessario evitarlo. A seconda della versione di java che stai usando, potresti spiegare i tuoi risultati imprevedibili.

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]); 
    }  
} 

uscite

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

Nota che un backslash è il carattere di escape regexp, ma perché una barra rovesciata è anche il carattere di escape in sorgente Java avete bisogno di due di loro per spingere la barra rovesciata nella regexp.

+0

molto utile per conoscere i simboli speciali. Ha aiutato a risolvere il problema enormemente. Grazie per il tuo contributo :) –

2

La libreria Guava ha una bella classe Splitter che è un'alternativa molto più conveniente a String.split(). I vantaggi sono che puoi scegliere di dividere la stringa su caratteri specifici (come '|'), o su stringhe specifiche, o con espressioni regolari, e puoi scegliere cosa fare con le parti risultanti (tagliarle, lanciare parti vuote vuote ecc. .).

Per esempio è possibile chiamare

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

mentre apprezzo il fatto che non vedo l'ora di provare e ottenere una libreria di terze parti all'interno del progetto haha!Le cose sono abbastanza difficili da raccogliere come è adesso. Prenoterò questo marchio per uso futuro. –

+1

Posso capirlo, ma mi assicuro che Guava sia una libreria davvero utile che rende la programmazione in Java molto più comoda in molti casi. Quindi dovresti dare un'occhiata definitiva quando hai del tempo libero. –

+0

Pensa a Guava nella stessa categoria di Apache Commons. Fornisce alcune funzionalità di base davvero utili. –

3

È possibile utilizzare 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 

Ovviamente si può sempre annidarlo all'interno di un ciclo while se si hanno più stringhe.

Inoltre, è necessario importare java.util. * Affinché funzioni.

0

Considerando uno scenario in cui abbiamo letto una riga dal file csv o xls sotto forma di stringa e necessario separare le colonne in una matrice di stringa in base ai delimitatori.

seguito è il frammento di codice per realizzare questo 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; 
    } 

Sopra frammento di codice contiene chiamata di metodo a StringSplitToArray dove nel metodo converte il filo di matrice di stringhe in dividendo la riga a seconda del delimitatore specificato o passato al metodo. Delimitatore può essere separatore virgola (,) o doppio codice (")

Per ulteriori informazioni su questo, seguire questa link:. http://scrapillars.blogspot.in

Problemi correlati