Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Regular Expressions

  1. #1
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447

    Regular Expressions

    Sto cercando di realizzare un piccolo programma che analizza un codice html e ne "estrae" i tag e le stringhe di testo. Per adesso ho scritto questo codice:
    codice:
    String codeHtml = "<html> <body> 
    
     Ciao Mondo </p> </body> </html>";
    		
    Pattern pat = Pattern.compile("(</?\\w+\\>) |  /*codice mancante*/");
    Matcher mat = pat.matcher(codeHtml);
    		
    while(mat.find())
    	System.out.println(mat.group());
    codice:
    Output:
    <html> 
    <body> 
    
    
     
    </p> 
    </body>
    Con questo codice riesco ad "estrarre" solo i tag mentre il mio intento è quello di catturare anche le stringhe, nel mio esempio "Ciao Mondo". Come regular expression per definire ogni tipo di stringa avevo pensato a qualcosa del genere:
    codice:
    .+//<
    Il problema che in questo modo mi viene catturato anche il carattere <, mentre io vorrei solo indicare il fatto che la stringa si conclude con quel carattere.

    Spero di essermi spiegato e ringrazio anticipatamente.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    codice:
    Pattern.compile("(</?\\w+>)|[^<]+");
    Tradotto: un tag (di chiusura o apertura) OR uno o più caratteri che non siano <

    E nota che nel tuo pattern </?\\w+\\>, l'escape per > è superfluo.
    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 L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Anche se è passato un po' di tempo ti ringrazio andbin per la risposta...

    Adesso ho implementato questo metodo che riceve come argomento un file html e ne stampa tutti i tag o stringhe.
    codice:
    public void CodeHtml(File file) {
    try {
    	BufferedReader buf = new BufferedReader(new FileReader(file));
    	StringBuilder temp = new StringBuilder();
    		
    	char[] characters = new char[512];
    		
    	while(buf.read(characters) >= 0)
    		temp.append(characters);
    			
    	String codeHtml = temp.toString().replaceAll("\n", " ");
    			
    	Pattern pat = Pattern.compile("((</?\\w+>)|[^<]+)");
    	Matcher mat = pat.matcher(codeHtml);
    			
    	while(mat.find()) 
    		System.out.println("piece of code: " + mat.group());
    	} catch(Exception e) {
    		System.err.println(e);
            }	
    }
    Il file che ho usato come test è il seguente:
    codice:
    <html>
        <head>
        </head>
        <body>
        
    
     Ciao Mondo </p>
        </body>
    </html>
    Ed infine l'outup è il seguente:
    codice:
    piece of code: <html>
    piece of code:      
    piece of code: <head>
    piece of code:      
    piece of code: </head>
    piece of code:      
    piece of code: <body>
    piece of code:      
    piece of code: 
    
    
    piece of code:  Ciao Marco 
    piece of code: </p>
    piece of code:      
    piece of code: </body>
    piece of code:  
    piece of code: </html>
    piece of code:
    Dall'output che ottengo sembrerebbe che il comando mat.group() ritorni con periodicità una stringa vuota. Vorrei capire come mai succede questo e naturalmente come impedirlo...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pacio88
    Dall'output che ottengo sembrerebbe che il comando mat.group() ritorni con periodicità una stringa vuota. Vorrei capire come mai succede questo e naturalmente come impedirlo...
    No ... non sono stringhe vuote! Contengono gli spazi che ci sono tra un tag e l'altro (guarda bene il codice html postato)!!

    Se ti danno fastidio le sequenze di soli spazi, potresti fare un trim() della stringa. Se dopo il trim risulta di lunghezza 0, la ignori.

    Se vuoi escluderli tramite la regex ... dovrei pensarci un attimo. Se metti semplicemente [^<\\s]+ in effetti rimuovi gli spazi ma così facendo cattura solo le parti che non comprendono spazi. L'effetto collaterale è che una stringa " Ciao Mondo " la ottieni spezzata su 2 find "Ciao" e "Mondo". E probabilmente non è quello che vuoi, immagino.


    P.S. Una piccola nota che non avevo detto nel precedente post. Avevo copiato pari pari le parentesi ( ) che avevi messi nella prima parte. Se non devi ottenere il group 1, sono inutili.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.