Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [JAVA]Piccolo problema con split di una stringa

    salve ho una stringa del tipo String s="ciao ciao ciao"; e se applico il metodo split(" "); e lo assegno ad un array di stringhe mi trovo che l'array di stringhe ha 3 campi con "ciao" e un campo con " " ossia il metodo split dopo il primo spazio non riconosce il carattere successivo e un altro spazio e lo conta come se fosse un pezzo di stringa da dividere. Come risolvere? Devo usare un altro metodo per caso?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da james101 Visualizza il messaggio
    salve ho una stringa del tipo String s="ciao ciao ciao"; e se applico il metodo split(" "); e lo assegno ad un array di stringhe mi trovo che l'array di stringhe ha 3 campi con "ciao" e un campo con " " ossia il metodo split dopo il primo spazio non riconosce il carattere successivo e un altro spazio e lo conta come se fosse un pezzo di stringa da dividere.
    No, attenzione, il carattere spazio NON lo ritrovi nell'array. Dal momento che nella stringa iniziale hai più spazi consecutivi, il singolo spazio come separatore causa la presenza di stringhe "vuote" (lunghezza 0) tra due spazi adiacenti!

    Se hai:

    codice:
    String s = "ciao   ciao";
    con 3 spazi tra i due ciao, allora ottieni un array:

    [0] = "ciao"
    [1] = "" (stringa vuota!)
    [2] = "" (stringa vuota!)
    [3] = "ciao"

    Questo perché lo spazio fa da separatore e con i 3 spazi consecutivi si comporta così:

    codice:
    SPAZIO    SPAZIO    SPAZIO
           ""        ""

    Quote Originariamente inviata da james101 Visualizza il messaggio
    Come risolvere?
    Basta usare

    split(" +")

    ovvero il quantificatore per dire "uno o più spazi".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, attenzione, il carattere spazio NON lo ritrovi nell'array. Dal momento che nella stringa iniziale hai più spazi consecutivi, il singolo spazio come separatore causa la presenza di stringhe "vuote" (lunghezza 0) tra due spazi adiacenti!

    Se hai:

    codice:
    String s = "ciao   ciao";
    con 3 spazi tra i due ciao, allora ottieni un array:

    [0] = "ciao"
    [1] = "" (stringa vuota!)
    [2] = "" (stringa vuota!)
    [3] = "ciao"

    Questo perché lo spazio fa da separatore e con i 3 spazi consecutivi si comporta così:

    codice:
    SPAZIO    SPAZIO    SPAZIO
           ""        ""


    Basta usare

    split(" +")

    ovvero il quantificatore per dire "uno o più spazi".
    Perfetto grazie mille! soluzione anche molto semplice.
    In effetti quando andavo a stampare l'array di stringhe il risultato era semplicemente un campo vuoto che poteva essere confuso con uno spazio... grazie ancora!
    comunque adesso ho un altro piccolo problema chiamando split come

    String[] arr=s.split(" +|<|>");

    la stringa ciao mondo data<e> fine viene spezzata come

    arr[0]="ciao"
    arr[1]="mondo"
    arr[2]="data"
    arr[3]="e"
    arr[4]=""
    arr[5]"fine"

    e se splitto come

    String[] arr=s.split(" +|<|> ");

    il risultato è

    arr[0]="ciao"
    arr[1]="mondo"
    arr[2]="data"
    arr[3]="e>"
    arr[4]="fine"

    cosa dovrei passare a split come parametri per avere
    arr[0]="ciao"
    arr[1]="mondo"
    arr[2]="data"
    arr[3]="e"
    arr[4]="fine"

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da james101 Visualizza il messaggio
    cosa dovrei passare a split come parametri per avere
    arr[0]="ciao"
    arr[1]="mondo"
    arr[2]="data"
    arr[3]="e"
    arr[4]="fine"
    Così:

    codice:
    s.split(" *<|> *| +")

    In questo modo se ">" è seguito da 0 o più spazi viene trattato come un solo separatore. Idem, similare per < .
    Nota che ho spostato " +" come ultimo in OR.
    Ultima modifica di andbin; 08-11-2017 a 14:03
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Così:

    codice:
    s.split(" *<|> *| +")

    In questo modo se ">" è seguito da 0 o più spazi viene trattato come un solo separatore. Idem, similare per < .
    Nota che ho spostato " +" come ultimo in OR.
    grazie mille ancora una volta, e ancora una volta vado a complicare le cose

    String[] arr=s.split(" *<|> *| +");

    stringa: "<ciao> <mondo> data<e> fine"

    le parole ciao mondo data e fine vengono spezzate, ma ho sempre il problema di avere stringa vuota "" tra le stringhe nel risultato... scusami se ti chiedo un'altra cosa e ti stresso un po ma non riesco ad uscirne

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da james101 Visualizza il messaggio
    stringa: "<ciao> <mondo> data<e> fine"
    Si può fare di più rispetto a quanto ti ho scritto prima ma .... il problema principale è il "<" all'inizio prima di ciao.
    Se "<" è anche un separatore, all'inizio si ha una stringa vuota. Ci penso un attimo ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da james101 Visualizza il messaggio
    [...] ancora una volta vado a complicare le cose

    String[] arr=s.split(" *<|> *| +");

    stringa: "<ciao> <mondo> data<e> fine" [...]
    Ma alla fin fine quello che vuoi fare è solo "estrarre" dalla stringa le parole, in qualunque modo siano esse separate?

    Se sì potresti anche cambiare approccio e invece di cercare come spezzarla potresti andare a fare la ricerca del pattern che ti interessa.

    Esempio:

    codice:
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Test
    {
    	public static void main (String [] args) {
    		String test = "<ciao> <mondo> data<e> fine";
    		Matcher matcher = Pattern.compile ("\\w+").matcher (test);
    		while (matcher.find ()) {
    			String match = matcher.group ();
    			System.out.println ("match:" + match);
    		}
    	}
    	/* 	Output:
    	
    		match:ciao
    		match:mondo
    		match:data
    		match:e
    		match:fine
    	*/
    }
    Magari è meno immediato, ma se la struttura può variare molto questa soluzione è più sicura a mio modo di vedere.

    "\\w" serve per fare il matching con lettere minuscole, maiuscole, numeri e underscore (equivale a "[A-Za-z0-9_]"), puoi limitare la ricerca a sole lettere ("[A-Za-z]") o a qualsiasi altro pattern.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    invece di cercare come spezzarla potresti andare a fare la ricerca del pattern che ti interessa.
    Infatti è quello che avevo iniziato a pensare pure io. Però farei il pattern ragionando così: se "<", ">" e più spazi sono i separatori, allora farei una regex che corrisponde ad una sequenza contigua che non contiene questi caratteri.

    In pratica:

    codice:
    Matcher matcher = Pattern.compile("[^ <>]+").matcher(text);

    Breve spiegazione: il costrutto [ ] è una "classe" di N caratteri (lì è spazio, < e > ). Il ^ iniziale serve per "negare" la classe di caratteri. E il + quantifica "uno o più".
    Alla fin fine: una sequenza di caratteri che NON sono spazi, < e > .
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ma alla fin fine quello che vuoi fare è solo "estrarre" dalla stringa le parole, in qualunque modo siano esse separate?

    Se sì potresti anche cambiare approccio e invece di cercare come spezzarla potresti andare a fare la ricerca del pattern che ti interessa.

    Esempio:

    codice:
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Test
    {
        public static void main (String [] args) {
            String test = "<ciao> <mondo> data<e> fine";
            Matcher matcher = Pattern.compile ("\\w+").matcher (test);
            while (matcher.find ()) {
                String match = matcher.group ();
                System.out.println ("match:" + match);
            }
        }
        /*     Output:
        
            match:ciao
            match:mondo
            match:data
            match:e
            match:fine
        */
    }
    Magari è meno immediato, ma se la struttura può variare molto questa soluzione è più sicura a mio modo di vedere.

    "\\w" serve per fare il matching con lettere minuscole, maiuscole, numeri e underscore (equivale a "[A-Za-z0-9_]"), puoi limitare la ricerca a sole lettere ("[A-Za-z]") o a qualsiasi altro pattern.
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Infatti è quello che avevo iniziato a pensare pure io. Però farei il pattern ragionando così: se "<", ">" e più spazi sono i separatori, allora farei una regex che corrisponde ad una sequenza contigua che non contiene questi caratteri.

    In pratica:

    codice:
    Matcher matcher = Pattern.compile("[^ <>]+").matcher(text);


    Breve spiegazione: il costrutto [ ] è una "classe" di N caratteri (lì è spazio, < e > ). Il ^ iniziale serve per "negare" la classe di caratteri. E il + quantifica "uno o più".
    Alla fin fine: una sequenza di caratteri che NON sono spazi, < e > .
    Per il momento non ho il computer sottomano e non posso testare, grazie dell'aiuto ancora una volta, ma il problema è che la mia stringa può avere oltre che "<" ">", qualsiasi altra parentesi o carattere speciale come le virgolette, apostrofi,!,?... ecc ecc.
    Ad esempio la parola "l'altro" la dovrei spezzare in "l" e "altro" eliminando quindi l'apostrofo. In questo caso come si comporterebbe il matcher?

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da james101 Visualizza il messaggio
    [...] il problema è che la mia stringa può avere oltre che "<" ">", qualsiasi altra parentesi o carattere speciale come le virgolette, apostrofi,!,?... ecc ecc.
    Ad esempio la parola "l'altro" la dovrei spezzare in "l" e "altro" eliminando quindi l'apostrofo. In questo caso come si comporterebbe il matcher?
    Se vai a ricercare il pattern che ti interessa, che siano lettere maiuscole, lettere maiuscole e minuscole, caratteri alfanumerici (quel "\w"), o altro, qualsiasi altro carattere ci sia in mezzo non cambia il risultato. Nel tuo caso "l" e "altro" verrebbero considerate due parole distinte, ma in nessun caso l'apostrofo o un qualsiasi altro delimitatore verrebbero inclusi nel match.

    Se è questo quello che vuoi ottenere il codice che ho postato sopra funziona in tutti questi casi, se tu volessi in qualche caso includere altro nel matching, ad esempio se volessi che "agro-alimentare" fosse considerata un'unica parola (scusa non mi vengono esempi migliori adesso ), bisogna cambiare qualcosa.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.