Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Aiuto per RegEx con Vb.net
Forum - C# / VB.NET - Aiuto per RegEx con Vb.net

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 23:46
Domenica, 27/07/2008
Al momento sto cercando di far caricare un file e poter ottenere alcune stringhe di dati tra < > e non ci riesco.
Codice sorgente - presumibilmente VB.NET

  1. Dim logb As String
  2.         Dim log() As String
  3.         Dim perlog As String
  4.         logb = File.OpenText(OpenFileDialog1.FileName).ReadToEnd()
  5.         log = logb.Split(vbCrLf)
  6.         Dim reg As Regex = New Regex("\b\<()?\>")
  7.         Dim Matches As MatchCollection = reg.Matches(log(0))
  8.         For Each M As Match In Matches
  9.             MsgBox(M.ToString)
  10.         Next


al momento è quello che ho scritto e non da niente.
Devo ottenere il testo tra < > fregandomene di quello che c'è dietro e dopo  e poterle gestire con degli indici perchè sulla stessa riga potrebbero esserci più di un dato.
Se qualcuno mi vuole dare una mano perchè io ci sto provando da un ora con la guida di totem.
Grazie per l'aiuto. :D:):)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:21
Lunedì, 28/07/2008
Testo quotato

Postato originariamente da Mte90:
Codice sorgente - presumibilmente VB.NET

  1. Dim logb As String
  2.         Dim log() As String
  3.         Dim perlog As String
  4.         logb = File.OpenText(OpenFileDialog1.FileName).ReadToEnd()
  5.         log = logb.Split(vbCrLf)
  6.         Dim reg As Regex = New Regex("\b\<()?\>")
  7.         Dim Matches As MatchCollection = reg.Matches(log(0))
  8.         For Each M As Match In Matches
  9.             MsgBox(M.ToString)
  10.         Next




Ammetto che le espressioni regolari non sono facilissime, ma con un po' più di ragionamento, si capiscono bene. Analizziamo l'espressione:
"\b\<()?\>"
- \b : indica l'inizio di una parola. Dato che stai cercando stringhe delimitate da parentesi angolari, non puoi utilizzare \b. Questo perchè una parola è formata solo da lettere normali o accentate, e non caratteri speciali come questi.
- \< : inidica un "<". Niente da dire.
- () : le parentesi sono struttura di raggruppamento. Quindi perchè usarle se non devi raggruppare niente? Infatti dentro non c'è alcun testo. Come puoi vedere dalla lista dal capitolo C3, se devi rappresentare un qualsiasi carattere puoi usare ".", o \w se si tratta solo di lettere.
- ? : il quantificatore ? è usato per indicare 0 o 1 ripetizioni. Quindi staresti cercando tutte le stringhe delimitate da parentesi angolari che contengano al massimo un carattere... E non mi sembra proprio che tu voglia fare così. Per indircare un qualsiasi numero di ripetizioni, si usa il quantificatore "*", oppure "+" se vuoi che ce ne sia almeno una.
- \> : indica un ">". Niente da dire.

In conclusione, quello che volevi scrivere è:
"\<.*\>"
Ossia: qualsiasi numero di caratteri (tranne a capo) delimitati da due parentesi angolari.
Inoltre, poichè ti serve il contenuto delle parentesi, puoi utilizzare il costruttore di raggruppamento che assegna nomi alle espressioni:
"\<(?<Contenuto>.*)\>"

Codice sorgente - presumibilmente VB.NET

  1. Dim logb As String
  2. Dim log() As String
  3. Dim perlog As String
  4. logb = File.OpenText(OpenFileDialog1.FileName).ReadToEnd()
  5. log = logb.Split(vbCrLf)
  6.  
  7. Dim reg As Regex = New Regex("\<(?<Contenuto>.*)\>")
  8. Dim Matches As MatchCollection = reg.Matches(log(0))
  9. For Each M As Match In Matches
  10.   'Come si vede chiaramente dall'esempio in C4,
  11.   'per ottenere il valore di un Match, si usa la
  12.   'proprietà Value
  13.   MsgBox(M.Value.ToString)
  14. Next


Questi messagebox ti faranno vedere le occorrenze catturate, ma anche con le parentesi. Ossia nella stringa:
"<ciao> <uno>"
Visualizzeranno: "<ciao>" e "<uno>".
Per far visualizzare solo il contenuto, si usa la proprietà group:
Codice sorgente - presumibilmente Plain Text

  1. MsgBox(M.Groups("Contenuto").Value)


E visualizzerà: "ciao" e "uno".

Ultima modifica effettuata da Il Totem il 28/07/2008 alle 11:23
PM Quote
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 14:18
Lunedì, 28/07/2008
Perfetto, il codice che avevo scritto io era un collage di diversi codici che ho trovato XD
Adesso provo, queste regex mi servoo per un sistema di elaborazioni scripting al programma spero che funzioni XD
Grazie

Ultima modifica effettuata da Mte90 il 28/07/2008 alle 14:19
PM Quote
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 15:21
Lunedì, 28/07/2008
Non mi funziona mi mostra la riga intera...ecco un esempio di riga che deve analizzare:
File rinominati in <C:\Documents and Settings\Utente\Documenti\prova> alle ore 23.3.3 con Renamer <1.7.0.0>

<nuovo foglio di lavoro di microsoft excel.xls> --> <NUOVO FOGLIO DI LAVORO DI MICROSOFT EXCEL.XLS>
io devo prendere il contenuto delle <> anche se ci sn più strignhe nella stessa riga...

il codice che ho usato adesso è
Codice sorgente - presumibilmente VB.NET

  1. Dim logb As String
  2.         Dim log() As String
  3.         Dim perlog As String
  4.         logb = File.OpenText(OpenFileDialog1.FileName).ReadToEnd()
  5.         log = logb.Split(vbCrLf)
  6.         Dim reg As Regex = New Regex("\<.*\>")
  7.         Dim Matches As MatchCollection = reg.Matches(log(0))
  8.         For Each M As Match In Matches
  9.             MsgBox(M.Value.ToString)
  10.         Next


L'altro postato da te nn mi funziona mi fà vedere la stessa cosa.
Codice sorgente - presumibilmente VB.NET

  1. Dim reg As Regex = New Regex("\<(?<Contenuto>.*)\>")
  2.         Dim Matches As MatchCollection = reg.Matches(log(0))
  3.         For Each M As Match In Matches
  4.             MsgBox(M.Groups("Contenuto").Value)
  5.         Next


Questo mi fà vedere C:\Documents and Settings\Utente\Documenti\prova> alle ore 23.3.3 con Renamer <1.7.0.0 .
senza le <> iniziali e finali ma non mi divide quelle nella stessa stringa.
Conviene che splitto la stringa e poi le passo con le regex?
Devo riuscire ad ottenre il contenuto delle <> in array così li gestisco meglio...
Grazie per l'aiuto:k:

Ultima modifica effettuata da Mte90 il 28/07/2008 alle 15:24
PM Quote
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 21:34
Lunedì, 28/07/2008
risolto con questo codice:
Codice sorgente - presumibilmente VB.NET

  1. Dim logb As String
  2.         Dim log() As String
  3.         logb = File.OpenText(OpenFileDialog1.FileName).ReadToEnd()
  4.         log = logb.Split(vbCrLf)
  5.         Dim reg As Regex = New Regex("\<(?<Contenuto>.*)\>.*\<(?<Contenuto2>.*)\>")
  6.         Dim Matches As MatchCollection = reg.Matches(log(0))
  7.         For Each M As Match In Matches
  8.             MsgBox(M.Groups("Contenuto").Value)
  9.             MsgBox(M.Groups("Contenuto2").Value)
  10.         Next


Per me si può anche chiudere...

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:17
Martedì, 29/07/2008
No. Non direi.
Il mio codice è giusto, e lo è anche l'output: tutta la stringa, infatti, è contenuta in una coppia di parentesi angolari. Tuttavia l'interprete regex ha preso l'occorrenza più grande (di solito non succede). In questo caso, possiamo limitare il range di caratteri presi in considerazioni tra < e >, ad esempio con queste regex:

1. "\<.*?\>" prende una stringa tra <>, con il minor numero di caratteri possibili: ossia, se ci sono più occorrenze possibili, prenderà quella che occupa meno spazio;
2. "\<[\w\W-[\<\>\n]]*\>" prende una stringa tra <>, a patto che non contenga a sua volta altre parentesi angolari;

Io ti consiglio la seconda: le ho testate entrambe e funzionano bene.

PM Quote
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 15:37
Martedì, 29/07/2008
:k:

PM Quote
Avatar
Mte90 (Member)
Guru


Messaggi: 1144
Iscritto: 25/03/2008

Segnala al moderatore
Postato alle 22:59
Giovedì, 31/07/2008
Sto provando il secondo, ma cm lo prendo il testo della regex?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:23
Venerdì, 01/08/2008
Nello stesso modo di prima:
"\<(?<Contenuto>[\w\W-[\<\>\n]]*)\>"
Non l'ho messo perchè pensato lo mettessi tu dopo.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo