Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] listare dati ottenuti da regex
Forum - C# / VB.NET - [VB.NET] listare dati ottenuti da regex

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
fabio7586 (Normal User)
Newbie


Messaggi: 18
Iscritto: 07/05/2008

Segnala al moderatore
Postato alle 19:37
Mercoledì, 29/08/2012
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:
Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2. Imports System.Text.RegularExpressions
  3. Public Class FrmMain
  4.     Private Sub btnApriFile_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnApriFile.Click
  5.         Dim open As New OpenFileDialog()
  6.         open.Filter = "File di testo|*.txt"
  7.         If open.ShowDialog() = DialogResult.OK Then
  8.             Dim reader As New StreamReader(open.OpenFile())
  9.             RichTextBox1.Text = reader.ReadToEnd()
  10.             reader.Close()
  11.         End If
  12.     End Sub
  13.     Private Sub btnSalvaIndirizziEmail_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSalvaIndirizziEmail.Click
  14.         Dim Save As New SaveFileDialog()
  15.         Save.Filter = "File di testo|*.txt"
  16.         If Save.ShowDialog() = DialogResult.OK Then
  17.             Dim Writer As New StreamWriter(Save.FileName)
  18.             For Each Item As String In lstEmail.CheckedItems
  19.                 Writer.WriteLine(Item)
  20.             Next
  21.             Writer.Close()
  22.         End If
  23.     End Sub
  24.     Private Sub btnTrovaIndirizziEmail_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTrovaIndirizziEmail.Click
  25.         Dim text As String = RichTextBox1.Text
  26.         Dim startsearch As String = "<h1>"
  27.         Dim endsearch As String = "</h1>"
  28.         Dim Email As New Regex("mailto:" & "\b(\w+)\s*(@|at|\[at\])\s*(\w+)\s*(\.|dot|\[dot\])(\w+)", RegexOptions.Multiline)
  29.         Dim testo As New Regex("(?<=" & startsearch & ").+(?=" & endsearch & ")", RegexOptions.Multiline)
  30.         For Each M As Match In Email.Matches(text)
  31.             lstEmail.Items.Add([String].Format("{0}@{1}{2}{3}", M.Groups(1), M.Groups(3), M.Groups(4).Value, M.Groups(5).Value), True)
  32.         Next
  33.         [b]For Each G As Match In testo.Matches(text)
  34.             lstnome.Items.Add([String].Format("{0}{1}{2}{3}", G.Groups(1), G.Groups(2), G.Groups(3).Value, G.Groups(4).Value), True)
  35.         Next[/b]
  36.     End Sub
  37.     Private Sub btnEsci_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnEsci.Click
  38.         Application.[Exit]()
  39.     End Sub
  40. 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?

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 20:31
Mercoledì, 29/08/2012
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..
Codice sorgente - presumibilmente Plain Text

  1. 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 ;)


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
fabio7586 (Normal User)
Newbie


Messaggi: 18
Iscritto: 07/05/2008

Segnala al moderatore
Postato alle 0:04
Giovedì, 30/08/2012
Testo quotato

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..
Codice sorgente - presumibilmente Plain Text

  1. 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


fabio7586 ha allegato un file: a.zip (7317 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da fabio7586 il 30/08/2012 alle 4:19
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 10:29
Giovedì, 30/08/2012
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:
http://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_ ...
Ciao:)


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
fabio7586 (Normal User)
Newbie


Messaggi: 18
Iscritto: 07/05/2008

Segnala al moderatore
Postato alle 14:48
Giovedì, 30/08/2012
Testo quotato

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:
http://www.pierotofy.it/pages/guide/Guida_al_Visual_Basic_ ...
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è?

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 15:42
Giovedì, 30/08/2012
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.


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
fabio7586 (Normal User)
Newbie


Messaggi: 18
Iscritto: 07/05/2008

Segnala al moderatore
Postato alle 16:55
Giovedì, 30/08/2012
Testo quotato

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


fabio7586 ha allegato un file: espressioni regolari.zip (96747 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
fabio7586 (Normal User)
Newbie


Messaggi: 18
Iscritto: 07/05/2008

Segnala al moderatore
Postato alle 17:55
Giovedì, 30/08/2012
Testo quotato

Postato originariamente da fabio7586:

Testo quotato

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 il 30/08/2012 alle 18:31
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 18:34
Giovedì, 30/08/2012
Bene.. Si, le listobox sono molto semplici e utili da usare.. Bastava un po' di pazienza con il debug..
CIao!:k:


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo