Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    29

    [JAVA]RegEx dubbi sul uso di matcher.groupCount() e matcher.group()

    Ciao a tutti.
    La regex e divisa in due gruppi, il gruppo 1 trova i tag e il gruppo 2 trova il testo che c'è tra i tag...
    Il mio problema è il seguente:
    Lanciando il codice sottostante, la variabile "gruppo" dentro il while, vale sempre 2.
    Domanda-1: Non dovrebbe darmi l'idice del gruppo che sta usando e se non è cosi, come si può fare?
    Domanda-2: Se modifico la riga: "trovato = matcher10.group(2).toString();" in modo di avere solo le coincidenze del gruppo 2 mi lancia un java.lang.NullPointerException?
    Qualcuno mi può aiutare per favore.



    codice:
    // Il gruppo 1 trova i tag e il gruppo 2 trova cio che c'è tra i tag...
    String pattern = "(<[^>]*>)|([^<]+)"; 
    Pattern regPat = Pattern.compile(pattern10, Pattern.CASE_INSENSITIVE);
    Matcher matcher = null;
    String testo = "
    
    ciao</P>";
    matcher10 = regPat.matcher(testo);
    int gruppo = 0;
    String trovato = "";
    while (matcher.find())
    {
       gruppo = matcher.groupCount();
       trovato = matcher.group().toString();
       
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]RegEx dubbi sul uso di matcher.groupCount() e matcher.group()

    Originariamente inviato da Moncho
    Non dovrebbe darmi l'idice del gruppo che sta usando e se non è cosi, come si può fare?
    No. I gruppi trovati sarebbero questi:

    0 "

    "
    1 "

    "
    2 null
    ------------
    0 "ciao"
    1 null
    2 "ciao"
    ------------
    0 "</P>"
    1 "</P>"
    2 null
    ------------

    Ti è più chiaro cosa succede? find() trova 3 occorrenze. Nella prima trova

    e lo trova come gruppo 1. Il gruppo 2 non c'è, non matcha nulla.
    Nella seconda, trova "ciao", stavolta il gruppo 1 non matcha nulla ma matcha con il gruppo 2.
    Nel terzo è praticamente come il primo.

    Usando:
    codice:
    String pattern = "<[^>]*>([^<]*)</[^>]*>";
    String testo = "
    
    ciao</P>   hello";
    si ha:

    0 "

    ciao</P>"
    1 "ciao"
    ------------
    0 "hello"
    1 "hello"
    ------------
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    29

    [JAVA]RegEx dubbi sul uso di matcher.groupCount() e matcher.group()

    La tua spiegazione è chiarissima.
    Riguardo la modifica fatta a la regex non mi serve per che io voglio spezzare la stringa originale
    es. “

    Utente non valido</P>” e siccome devo inserire al posto del testo che c'è tra i tag una chiamata a funzione, mi serve ogni pezzo della stringa originale per che alla fine dovrò generare qualcosa come: “

    ” + stampaMsg(585) + “</P>” (succede che devo internazionalizzare il codice di una applicazione già funzionante).
    Grazie ai tuoi suggerimenti ho capito come tirare fuori ogni coincidenza del gruppo 1 e 2
    Il codice è questo:

    codice:
    // Il gruppo 1 trova i tag e il gruppo 2 trova cio che c'è tra i tag...
    StringBuffer sb = new StringBuffer();
    String pattern = "(<[^>]*> )|([^<]+)"; 
    Pattern regPat = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
    Matcher matcher = null;
    String testo = "
    
    ciao</P>";
    matcher10 = regPat.matcher(testo);
    int gruppo = 0;
    String trovato = "";
    while (matcher.find())
    {
       if (matcher.group(1) != null)
       {    
             sb.append("\"" + matcher.group(1) + "\"");
       }     
       else
       {    
             sb.append("+lanciaMsg(" + matcher.group(2) + ")+");
       }
       
    }
    Stampa a video : "

    " + lanciaMsg("ciao") + "</P>"

    Un ultima domanda, il metodo groupCount() restituisce soltanto la quantità di gruppi (cioè la somma) che ha la regex che stiamo usando e non l'indice del gruppo che ha dato una coincidenza positiva giusto?
    Grazie ancora.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]RegEx dubbi sul uso di matcher.groupCount() e matcher.group()

    Originariamente inviato da Moncho
    Stampa a video : "

    " + lanciaMsg("ciao") + "</P>"
    Se devi solamente e semplicemente inserire un testo fisso, allora basterebbe anche soltanto un replaceAll()!!!!

    codice:
    String pattern = "(<[^>]*>)([^<]*)(</[^>]*>)";
    String testo = "
    
    ciao</P>";
    
    String out = testo.replaceAll(pattern, "\"$1\" + lanciaMsg(\"$2\") + \"$3\"");
    
    System.out.println(out);
    L'output è:

    "

    " + lanciaMsg("ciao") + "</P>"



    Originariamente inviato da Moncho
    Un ultima domanda, il metodo groupCount() restituisce soltanto la quantità di gruppi (cioè la somma) che ha la regex che stiamo usando e non l'indice del gruppo che ha dato una coincidenza positiva giusto?
    Ritorna il numero di gruppi "catturanti" presenti nel pattern.

    Che poi group(n) ritorni null centra poco. Se il pattern ha N gruppi, groupCount ritorna N. Esempio:
    (\d(\d))(\w)

    In questo caso hai 3 gruppi, groupCount() ritorna 3 e a group() puoi passare un valore compreso tra 0 e 3 (incluso).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    29

    [JAVA]RegEx dubbi sul uso di matcher.groupCount() e matcher.group()

    Ti ringrazio di aver esaurito i miei dubbi.
    Riguardo l'esempio usando replaceAll, il problema è che le stringhe non hanno sempre lo stesso formato (cioè apertura tag testo chiusura tag), a volte capitano stringhe di questo genere

    codice:
    "Non è stato trovato alcun codice cliente.
    Per ritornare alla pagina di ricerca premere il tasto indietro
    
    "
    In casi come questo con il codice che ti ho fatto vedere nella risposta anteriore, riesco a capire che: se la coincidenza appartiene al gruppo uno, è un tag e se invece appartiene al gruppo due, è una stringa.
    Con il tuo ultimo esempio anche se molto interessante non ci potrei arrivare.
    Grazie ancora.

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.