Autore Topic: problema regex  (Letto 711 volte)

Offline TheMonk

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Sistema operativo:
    Windows 7
problema regex
« il: 09 Luglio 2012, 11:07:21 CEST »
0
salve, sto facendo il parsing per un'applicazione e sto utilizzando le regex per ripotare e pulire una tabella dal web. In pratica ho fatto una regex per prendere ogni colonna della tabella e poi un'altra per pulirne una per una. Il problema è che una colonna non viene pulita correttamente ma la regex è giusta, questo è il codice:
Codice (Java): [Seleziona]
public class ParserAirportCiampinoActivity extends Activity {
        /** Called when the activity is first created. */

        WebView webview;




        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                //Qua inserisco la url del sito da dove prendere l'html
                String url = "[url=http://www.adr.it/pax-fco-voli-in-tempo-reale?p_p_id=3_WAR_realtimeflightsportlet&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_pos=1&p_p_col_count=3&_3_WAR_realtimeflightsportlet_tab=arrival&_3_WAR_realtimeflightsportlet_keywords=&_3_WAR_realtimeflightsportlet_advancedSearch=false&_3_WAR_realtimeflightsportlet_andOperator=true&_3_WAR_realtimeflightsportlet_airport=&_3_WAR_realtimeflightsportlet_carrier=&_3_WAR_realtimeflightsportlet_codNat=&_3_WAR_realtimeflightsportlet_codScaOpe=CIA&_3_WAR_realtimeflightsportlet_codVet=&_3_WAR_realtimeflightsportlet_date=2012-07-09&_3_WAR_realtimeflightsportlet_dataNumVol=&_3_WAR_realtimeflightsportlet_numVol=&_3_WAR_realtimeflightsportlet_rouIata=&_3_WAR_realtimeflightsportlet_orario=00%3a00-24%3a00&_3_WAR_realtimeflightsportlet_searchType=standard&_3_WAR_realtimeflightsportlet_orderByCol=comparationTime&_3_WAR_realtimeflightsportlet_orderByType=asc&_3_WAR_realtimeflightsportlet_delta=75";]Voli in Tempo Reale Aeroporto di Fiumicino - Adr.it - Aeroporti di Roma[/url]


                class MyJavaScriptInterface  
                {
                        //questo metodo utilizza come parametro il contenuto della url (l'html) in formato stringa
                        public void processHTML(String html)  
                        {  

                               
                               
                                //Qua scrivo la regex per fare la ricerca di testo
                                String myPattern = "title=\"[A-Z]{2,15}";
                                //Questo dovrebbe significare che la regex viene applicata su tutto l'html (String HTML)
                                Pattern p = Pattern.compile(myPattern);
                                //il matcher è il risultato finale della regex, convertire questo in stringa
                                Matcher compagnia = p.matcher(html);
                                String mStringa= compagnia.toString();
                                //regex volo
                                String bi = "(?ms)<td class=\"align-left col-2.*?> (.*?)</td>";
                                Pattern o = Pattern.compile(bi);
                                Matcher volo = o.matcher(html);
                                //regex arrivo
                                String ar = "(?ms)<td class=\"align-left col-3.*?> (.*?)</td>";
                                Pattern q = Pattern.compile(ar);
                                Matcher arrivo = q.matcher(html);
                                //regex orario
                                String or = "(?ms)<td class=\"align-left col-4.*?> (.*?)</td>";
                                Pattern r = Pattern.compile(or);
                                Matcher orario = r.matcher(html);
                                //regex orario effettivo
                                String oref = "(?ms)<td class=\"align-left col-6.*?> (.*?)</td>";
                                Pattern t = Pattern.compile(oref);
                                Matcher orario2 = t.matcher(html);
                                //regex stato
                                String st =  "(?ms)<td class=\"align-left col-8.*?> (.*?)</td>";
                                Pattern v = Pattern.compile(st);
                                Matcher stato = v.matcher(html);
                               
                               

                                /*while (compagnia.find()) {
                                        Log.d("TAG" , "Stringa trovata: " + compagnia.start());
                                        String om = "[A-Z0-9]{2} [0-9]{4}";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(compagnia.group());
                                        Log.d("Tag", "Termine stringa: " + compagnia.end());
                                        String ca = compagnia.group();
                                        String[] segs = ca.split("\"");
                                        Log.d("tag", segs[1]);

                                }*/
           
                                while (volo.find()) {
                                        Log.d("TAGn" , "Stringa trovata: " + volo.start());
                                        String om = "[A-Z0-9]{2} [0-9]{4}";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(volo.group());
                                        Log.d("Tagn", "Termine stringa: " + volo.end());
                                        String ca = volo.group();
                                        String[] segs = ca.split("\"");
                                        Log.d("tag", segs[10]);
                                        }
                               
                                /*while (arrivo.find()) {
                                        Log.d("TAG" , "Stringa trovata: " + arrivo.start());
                                        String om = "(?<=^|>)[^><]+?(?=<|$)";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(arrivo.group());
                                        Log.d("Tag", "Termine stringa: " + arrivo.end());
                                        String cb = arrivo.group();
                                        String[] segs = cb.split("\"");
                                        Log.d("tag", segs[6]);
                                }
                                while (orario.find()) {
                                        Log.d("TAG" , "Stringa trovata: " + orario.start());
                                        String om = "(?<=^|>)[^><]+?(?=<|$)";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(orario.group());
                                        Log.d("Tag", "Termine stringa: " + orario.end());
                                        String cb = orario.group();
                                        String[] segs = cb.split("\"");
                                        Log.d("tag", segs[6]);
                                }
                                while (orario2.find()) {
                                        Log.d("TAG" , "Stringa trovata: " + orario2.start());
                                        String om = "(?<=^|>)[^><]+?(?=<|$)";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(orario2.group());
                                        Log.d("Tag", "Termine stringa: " + orario2.end());
                                        String cb = orario2.group();
                                        String[] segs = cb.split("\"");
                                        Log.d("tag", segs[6]);
                                }
                                while (stato.find()) {
                                        Log.d("TAG" , "Stringa trovata: " + stato.start());
                                        String om = "(?<=^|>)[^><]+?(?=<|$)";
                                        Pattern pi = Pattern.compile(om);
                                        Matcher mi = pi.matcher(stato.group());
                                        Log.d("Tag", "Termine stringa: " + stato.end());
                                        String cb = stato.group();
                                        String[] segs = cb.split("\"");
                                        Log.d("tag", segs[6]);
                                } */

                        }

                }


                webview = (WebView) findViewById(R.id.webview);
                webview.getSettings().setJavaScriptEnabled(true);
                webview.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
                webview.setWebViewClient(new WebViewClient() { 
                        @Override
                        public void onPageFinished(WebView view, String url)
                        {
                                /* This call inject JavaScript into the page which just finished loading. */

                                webview.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
                        }
                });


                webview.loadUrl("[url=http://www.adr.it/pax-fco-voli-in-tempo-reale?p_p_id=3_WAR_realtimeflightsportlet&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_pos=1&p_p_col_count=3&_3_WAR_realtimeflightsportlet_tab=arrival&_3_WAR_realtimeflightsportlet_keywords=&_3_WAR_realtimeflightsportlet_advancedSearch=false&_3_WAR_realtimeflightsportlet_andOperator=true&_3_WAR_realtimeflightsportlet_airport=&_3_WAR_realtimeflightsportlet_carrier=&_3_WAR_realtimeflightsportlet_codNat=&_3_WAR_realtimeflightsportlet_codScaOpe=CIA&_3_WAR_realtimeflightsportlet_codVet=&_3_WAR_realtimeflightsportlet_date=2012-07-09&_3_WAR_realtimeflightsportlet_dataNumVol=&_3_WAR_realtimeflightsportlet_numVol=&_3_WAR_realtimeflightsportlet_rouIata=&_3_WAR_realtimeflightsportlet_orario=00%3a00-24%3a00&_3_WAR_realtimeflightsportlet_searchType=standard&_3_WAR_realtimeflightsportlet_orderByCol=comparationTime&_3_WAR_realtimeflightsportlet_orderByType=asc&_3_WAR_realtimeflightsportlet_delta=75"]Voli in Tempo Reale Aeroporto di Fiumicino - Adr.it - Aeroporti di Roma[/url]);}
}

La regex in questione è "volo", questo è il logcat:

07-09 08:50:38.928: D/tag(464): >FR 7097</a></div> </td>

devo ottenere solo la parte in grassetto, l html non ci deve stare... come posso risolvere?




   


      
            
         
         
   


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:problema regex
« Risposta #1 il: 09 Luglio 2012, 18:37:28 CEST »
0
Fai un:

Codice: [Seleziona]
String[] segs = ca.split("\"");"
in una stringa che termina con:

Codice: [Seleziona]
&amp;id=922181">FR 9686</a></div> </td>
è ovvio che ti ritorni la stringa dopo il separatore " (quotation mark).

Compili ogni volta i pattern anche nei loop, questo è inefficiente, consumi tempo e molta memoria, consiglio di assegnali come attributi statici di una classe, in questo modo vengono creati una volta sola.

Ti consiglio di studiarti bene le regular expression, ad occhio non ho fatto prove, le tue regole non sembrano molto efficienti.

adb logcat | tee /tmp/logcat | grep TAG

Offline TheMonk

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S
  • Sistema operativo:
    Windows 7
Re:problema regex
« Risposta #2 il: 10 Luglio 2012, 11:31:22 CEST »
0
Grazie, ho risolto il problema e sto cambiando anche il codice come suggerivi. Grazie ancora