Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Java] Regex ricerca multipla

    Salve a tutti ...

    Stavo cercando di scrivere un client http personalizzato che svolga determinate funzioni.


    Avevo bisogno di estrarre da una pagina html determinati valori.
    Volevo consultarmi con voi ed in particolare con andbin se ci sono metodi più efficaci o cmq più eleganti per fare ciò visto che io non riesco attualmente ad usare al meglio le regex.

    Sono convito che si può fare di più.


    Per capirci ho una classe con un metodo statico di questo tipo :

    Codice PHP:
    public class Regex   
    {    
      private static 
    java.util.regex.Pattern p;      
      private static 
    java.util.regex.Matcher m;  

      public static 
    String singleRegex(String regex,String html)      
    {          
    java.util.regex.Pattern.compile(regexjava.util.regex.Pattern.CASE_INSENSITIVE);          
    p.matcher(html);          
    String tmp "";          
    if(
    m.find())          
    {              
    tmp += html.substring(m.start(),   m.end());      
          
    }          
    return 
    tmp;      


    Però ovviamente questo metodi si ferma alla prima occorrenza.

    Facciamo un esempio. Io in questa pagina html ho un insieme di chiavi di questo tipo : variabile="valore";

    devo estrarre tutte questa coppia di variabili="valore" e poi eliminare gli apici ...

    Purtroppo con questo metodo riesco a restituire solo una String e fermarmi alla prima occorrenza che trovo.

    Per prendere il resto di coppie variabile=valore nel resto della pagina nel metodo chiamante continuavo con una serie di indexof etc.


    Ecco un esempio di cosa combino ... :

    Codice PHP:
    private void instantiateOtherVillages(String html)      {          
    Village v;          
    html Regex.singleRegex("<table cellpadding=\"1\" cellspacing=\"1\" id=\"vlist\"><thead>.*?</table>"html);                    
    int startIndex 0;          
    int endIndex 0;                    
    String link "";          
    String name "";          
    int x 0;          
    int y 0;                    
    while( (
    startIndex html.indexOf("<a href=\"?newdid=")) != -1)          {                              
    link getInputLinkVillage(html);              System.out.println(link);              
    name getInputNameVillage(html);              System.out.println(name);                            
    getInputCoordinateX(html);              System.out.println(x);              
    getInputCoordinateY(html);              System.out.println(y);                            
    = new Village(link,name,new Coordinate(x,y));              collectionVillages.add(v);                            
    endIndex html.indexOf("</tr>",startIndex);              
    html html.substring(endIndex);                        
    }          
    return;      
    }            

    /*utility*/      

    private String getInputLinkVillage(String html)      {          
    String link "";                    
    link Regex.singleRegex("\\?newdid=.*?\""html);          
    link link.replaceAll("\"""");                    return link;      
    }


    //seguono altri metodi simili a getInputLinkVillage()
    //insomma sono metdi per andare a pescare un valore alla volta... 

    Un metodo mi ritorna il valore della x
    un metodo il valore della y 
    che sono delle coordinate dove si trova un villaggio 
    .
     
    Un metodo mi ritorna il nome del villaggio e un metodo il link/url
    Ovviamente il tutto risulta molto pesante ed ingestibile ....

    Secondo me c'è pur un modo con le regex per trovare più cose contemporaneamente.... In che modo posso farlo ?
    Ad esempio trovare le coordinate X e Y sono due metodi praticamente identici, cambia la posizone in cui sono scritti nell'html per questo procedo in questo modo ... Idee?



    C'è qualche modo più elegante ed efficace ?

    Grazie

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

    Re: [Java] Regex ricerca multipla

    Originariamente inviato da JavaFurbix
    Codice PHP:
    p.matcher(html);          
    String tmp "";          
    if(
    m.find())          

    Però ovviamente questo metodi si ferma alla prima occorrenza.
    Generalmente è "tipico" usare il find() come condizione in un ciclo while. Il 'if' potrebbe andare bene solo se serve "la prima occorrenza, se esiste, e basta" (ovviamente).

    Quindi:
    while (m.find()) { ..... }

    Originariamente inviato da JavaFurbix
    Facciamo un esempio. Io in questa pagina html ho un insieme di chiavi di questo tipo : variabile="valore";

    devo estrarre tutte questa coppia di variabili="valore" e poi eliminare gli apici ...
    Dipende dove sono questi dati. Sono "testo" dentro qualche tag? O sono gli attributi di un tag?

    Originariamente inviato da JavaFurbix
    C'è qualche modo più elegante ed efficace ?
    Magari chiarisci con un esempio (anche solo un pezzetto) di html indicando cosa vuoi estrarre.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ecco ad esempio un html pezzo di html da estrarre :


    codice:
    		
    <input class="text" type="text" name="name" value="partName" />				
    <input class="text" type="text" name="village" value="5612165" maxlength="20" /> 
    <input type="hidden" name="w" value="" />  		<input type="hidden" name="login" value="1270780433" />

    diciamo che c'è da estrarre i campi name e value per ottenere
    per costruire poi una stringa per il post dei dati :

    name=PartName&village=5612165&..... etc


    cmq l'esempio che ti ho postato sopra... Alla fine non è possibile farsi un metodo per la ricerca di più valori ?

    Cioè se vorrei fare un metodo come sopra per le Regex che dovrebbe restituire più valori name=valore cosa dovrebbe restituire ? Un array ? E di che dimensioni ? Dovrei usarlo poi in maniera dinamica perchè non saprei apriori quante corrispondenze trova all'interno dell'html, quindi usare un ArrayList?

    O conviene non usare un metodo a parte scritto solo per le Regex ma integrare nel codice del metodo che riceve l'html stesso ??

    O altrimenti continuo come facevo sopra? cioè con tanti piccoli metodi che andavano a pescare un valore alla volta mettendo l'html da parsare in un ciclo e andando poi a "tagliuzzare" con substring ad ogni iterazione etc.. ??





    @edit

    ho provato a buttar giù qualcosa ... che ne dici di questo metodo ? Cmq nel codice del metodo chiamante è difficile da gestire ...

    codice:
    public static java.util.ArrayList<String> multipleRegex(String regex,String html)  	{  		
    java.util.ArrayList<String> tmp = new java.util.ArrayList<String>();  		
    p = java.util.regex.Pattern.compile(regex, java.util.regex.Pattern.CASE_INSENSITIVE);  		
    m = p.matcher(html);  		
    while(m.find())  		
    {  			
    tmp.add(html.substring(m.start(), m.end()));  		
    }  		
    for(String s : tmp)  		{  			
    java.util.logging.Logger.global.info(s);  		
    }  		
    return tmp;

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da JavaFurbix
    Alla fine non è possibile farsi un metodo per la ricerca di più valori ?
    Se vuoi farti un metodo che fa "tutto" e ritorna semplicemente le coppie nome+valore ovviamente certo che puoi farlo. Si tratta solo di un "incapsulamento" del codice.

    Le questioni di fondo sono sulla/e regex da usare. Devi mettere in conto diverse cose:
    a) Se devi fare la ricerca degli <input> solo su una sezione ristretta della pagina (es. metti che ci sono diversi <form> e a te interessa solo uno di questi, non gli altri!).
    b) Come devi accettare la sequenza/ordine degli attributi name e value del <input>. Se vuoi accettare solo "name seguito subito da value" o qualcosa di più generico (es. name e value in qualunque ordine anche con altri attributi in mezzo).

    Perché in base a questi criteri la/e regex cambiano e c'è bisogno di più o meno fasi di elaborazione. Vedi anche questa discussione in cui si parla proprio di analisi "annidata" e ristretta di tag in una pagina html.

    Originariamente inviato da JavaFurbix
    Cioè se vorrei fare un metodo come sopra per le Regex che dovrebbe restituire più valori name=valore cosa dovrebbe restituire ? Un array ? E di che dimensioni ?
    Chiaramente sarebbe preferibile usare una collezione (lista), quindi un List (l'oggetto concreto es. un ArrayList). Che contiene oggetti di che tipo .... beh, anche qui sarebbe preferibile se "modellano" in modo appropriato l'insieme di nome+valore, quindi ad esempio una tua classe es. AttributoForm che contiene nome e valore.
    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.