Oppure

Loading
29/08/12 17:37
fabio7586
Salve, sto cercando di estrapolare deti dati da una pagina web, e per riuscirci ho utilizzato delle regular expression. Il problema è che ci sono risucito a metà, nel senso:
Imports System.IO
Imports System.Text.RegularExpressions
Public Class FrmMain
    Private Sub btnApriFile_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnApriFile.Click
        Dim open As New OpenFileDialog()
        open.Filter = "File di testo|*.txt"
        If open.ShowDialog() = DialogResult.OK Then
            Dim reader As New StreamReader(open.OpenFile())
            RichTextBox1.Text = reader.ReadToEnd()
            reader.Close()
        End If
    End Sub
    Private Sub btnSalvaIndirizziEmail_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSalvaIndirizziEmail.Click
        Dim Save As New SaveFileDialog()
        Save.Filter = "File di testo|*.txt"
        If Save.ShowDialog() = DialogResult.OK Then
            Dim Writer As New StreamWriter(Save.FileName)
            For Each Item As String In lstEmail.CheckedItems
                Writer.WriteLine(Item)
            Next
            Writer.Close()
        End If
    End Sub
    Private Sub btnTrovaIndirizziEmail_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTrovaIndirizziEmail.Click
        Dim text As String = RichTextBox1.Text
        Dim startsearch As String = "<h1>"
        Dim endsearch As String = "</h1>"
        Dim Email As New Regex("mailto:" & "\b(\w+)\s*(@|at|\[at\])\s*(\w+)\s*(\.|dot|\[dot\])(\w+)", RegexOptions.Multiline)
        Dim testo As New Regex("(?<=" & startsearch & ").+(?=" & endsearch & ")", RegexOptions.Multiline)
        For Each M As Match In Email.Matches(text)
            lstEmail.Items.Add([String].Format("{0}@{1}{2}{3}", M.Groups(1), M.Groups(3), M.Groups(4).Value, M.Groups(5).Value), True)
        Next
        [b]For Each G As Match In testo.Matches(text)
            lstnome.Items.Add([String].Format("{0}{1}{2}{3}", G.Groups(1), G.Groups(2), G.Groups(3).Value, G.Groups(4).Value), True)
        Next[/b]
    End Sub
    Private Sub btnEsci_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnEsci.Click
        Application.[Exit]()
    End Sub
End Class

Il codice è corretto sino a dove ho lasciato in grassetto; le regex devono estrapolare le mail che sono subito dopo la scritta mailto: e che rispettino la sintassi, ed i nomi che sono gli unici tra i tag <h1>.
Il problema è che pur riuscendo ad ottenere il nome, non riesco a farlo uscire nella listbox...cosa che invece avviene per le mail.

Qualcuno è disponibile ad aiutarmi?
aaa
29/08/12 18:31
Renny
Ciao..
Uhm.. forse se posti qui anche 2,3 nomi e mail di esempio si può capire se il problema è la regex o altro. Ad esempio, nella tua regex x la mail, attento ad usare \w perché certe certi nomi nelle mail contengono anche numero o i caratteri "." o "_" (punti o underscore).
Altra cosa..
lstnome.Items.Add([String].Format("{0}{1}{2}{3}", G.Groups(1), G.Groups(2), G.Groups(3).Value, G.Groups(4).Value), True)

Cos'è quel True alla fine dell'istruzione? Ho verificato, il metodo add non lo prevede. Io uso vb.net su VS2010, ma presumo sia lo stesso anche per le altre versioni.
Ciao ;)
aaa
29/08/12 22:04
fabio7586
Postato originariamente da Renny:

Ciao..
Uhm.. forse se posti qui anche 2,3 nomi e mail di esempio si può capire se il problema è la regex o altro. Ad esempio, nella tua regex x la mail, attento ad usare \w perché certe certi nomi nelle mail contengono anche numero o i caratteri "." o "_" (punti o underscore).
Altra cosa..
lstnome.Items.Add([String].Format("{0}{1}{2}{3}", G.Groups(1), G.Groups(2), G.Groups(3).Value, G.Groups(4).Value), True)

Cos'è quel True alla fine dell'istruzione? Ho verificato, il metodo add non lo prevede. Io uso vb.net su VS2010, ma presumo sia lo stesso anche per le altre versioni.
Ciao ;)

Effettivamente il true non serve ad una mazza ^_^''....perdonami, ma non ho avuto molte occasioni per usare una listbox.. a me sembra fatta bene, ma ovviamente è la mia opinione...lol
come faccio a fargli notare anche i punti e gli underscore? ho impiegato 3 giorni per scrivere quella sintassi:-|
ho allegato uno zip con il file di testo su cui faccio le prove che non è altro che l'html di una pagina web presa da paginebianche.

Grazie
Ultima modifica effettuata da fabio7586 30/08/12 2:19
aaa
30/08/12 8:29
Renny
Ciao.
Per se vuoi modificare la regex, fai una ricerca in internet e scrivi regex email.. La sintassi per la cattura degli indirizzi email è tra le più diffuse e usate.. ;)
Comunque, per dire, basta sostituire \w con un gruppo di caratteri, tipo [A-Za-z0-9._].. tipo così
Anche se forse è il caso di cambiare approccio.
Se i dati li prendi da una pagina html perché non usare la classe HtmlDocument e cercare i tuoi dati filtrandoli per tag o Id?
Dai un'occhiata qua:
pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/Parsing_di_codice_HTML/
Ciao:)
aaa
30/08/12 12:48
fabio7586
Postato originariamente da Renny:

Ciao.
Per se vuoi modificare la regex, fai una ricerca in internet e scrivi regex email.. La sintassi per la cattura degli indirizzi email è tra le più diffuse e usate.. ;)
Comunque, per dire, basta sostituire \w con un gruppo di caratteri, tipo [A-Za-z0-9._].. tipo così
Anche se forse è il caso di cambiare approccio.
Se i dati li prendi da una pagina html perché non usare la classe HtmlDocument e cercare i tuoi dati filtrandoli per tag o Id?
Dai un'occhiata qua:
pierotofy.it/pages/guide/Guida_al_Visual_Basic_dotNET/Parsing_di_codice_HTML/
Ciao:)

Sicuramente è meglio, tant'è vero che stavo già studiandomeli da qua, ma il mio problema era che non riuscivo a popolare la listbox? idea del perchè?
aaa
30/08/12 13:42
Renny
sinceramente no...
Nel file che hai allegato non c'erano esempi di "nomi" su cui provare la regex.
La sintassi della listbox è corretta: il metodo .add permette di inserire oggetti vari, tra cui chiaramente le stringhe.
Se fai lstnome.add("tizio caio";) vedrai che funziona.
Dovresti fare il debug del ciclo for e vedere se effettivamente la regex funziona e c'è qualche match valido.
Ciao.
aaa
30/08/12 14:55
fabio7586
Postato originariamente da Renny:

sinceramente no...
Nel file che hai allegato non c'erano esempi di "nomi" su cui provare la regex.
La sintassi della listbox è corretta: il metodo .add permette di inserire oggetti vari, tra cui chiaramente le stringhe.
Se fai lstnome.add("tizio caio";) vedrai che funziona.
Dovresti fare il debug del ciclo for e vedere se effettivamente la regex funziona e c'è qualche match valido.
Ciao.


Nel file allegato ci sono 2 nomi racchiusi tra i tag <h1></h1> e sono quelli che mi interessano... il match è corretto tant'è vero che nel ciclo vi entra (ho fatto il debug) per due volte, e se vado ad inserire il risultato in una textbox me lo da correttamente, il problema, rimane, la listbox... in allegato ho inserito il codice sorgente
aaa
30/08/12 15:55
fabio7586
Postato originariamente da fabio7586:

Postato originariamente da Renny:

sinceramente no...
Nel file che hai allegato non c'erano esempi di "nomi" su cui provare la regex.
La sintassi della listbox è corretta: il metodo .add permette di inserire oggetti vari, tra cui chiaramente le stringhe.
Se fai lstnome.add("tizio caio";) vedrai che funziona.
Dovresti fare il debug del ciclo for e vedere se effettivamente la regex funziona e c'è qualche match valido.
Ciao.


Nel file allegato ci sono 2 nomi racchiusi tra i tag <h1></h1> e sono quelli che mi interessano... il match è corretto tant'è vero che nel ciclo vi entra (ho fatto il debug) per due volte, e se vado ad inserire il risultato in una textbox me lo da correttamente, il problema, rimane, la listbox... in allegato ho inserito il codice sorgente


ho risolto inserendo g in items.add :)

Per quanto riguarda il pattern, ho provato ad inserire \. per fargli leggere anche il punto, mentre per i caratteri speciali non ne ho idea, ma non funziona (l'underscore funziona già;), nel senso che non restituisce più risultati.
Ultima modifica effettuata da fabio7586 30/08/12 16:31
aaa