Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    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?

  3. #3
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.