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 - Regex e ListBox
Forum - C# / VB.NET - Regex e ListBox

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 23:09
Venerdì, 10/04/2009
Questo topic è stato chiuso dal moderatore

Ciao a tutti, oggi stavo cercando di usare le regex per eliminare tutte le scritte tra apici dei "write" del pascal.
Faccio così: carico il sorgente in una listbox e quindi ogni riga del sorgente corrisponde a un elemento della listbox.
Poi con questo codice:

Codice sorgente - presumibilmente VB.NET

  1. For i As Integer = 0 To ProgAnalizzato.Items.Count - 1
  2.             Dim write As String
  3.             write = Mid(LTrim(ProgAnalizzato.Items.Item(i)), 1, 5)
  4.             If System.String.Compare(write, "write", False) Then
  5.                 MsgBox("OK")
  6.                 Dim re2 As New Regex("'\w*'", RegexOptions.Compiled)
  7.                 Dim res As String = re2.Replace(ProgAnalizzato.Items.Item(i).ToString, "")
  8.                 ProgAnalizzato.Items.Item(i) = ""
  9.                 ProgAnalizzato.Items.Item(i) = res
  10.             End If
  11.         Next



"tento" di cancellare le critte tra apici di tutte le righe che cominciano con "write".
Solo che non mi va... quando lancio la procedura per ogni riga che legge (quindi anche quando non comincia con write), mi stampa la msgbox... come se l' if andasse a farsi benedire e poi comunque per le stringhe che cominciano con write, non fa niente.
Se invece inserisco gli elementi della listbox, durante lo sviluppo mi "mezzo" funziona solo che l' if non va lo stesso cancella tutto quello tra apici di qualsiasi riga...
Potete aiutarmi per favore?
Grazie mille :)

PM
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 23:28
Venerdì, 10/04/2009
uhm...nell'if prova ad usare string.startswith()...se non hai capito dimmelo

PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 23:33
Venerdì, 10/04/2009
Non ho capito 8-|

PM
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 23:39
Venerdì, 10/04/2009
Codice sorgente - presumibilmente VB.NET

  1. For i As Integer = 0 To ProgAnalizzato.Items.Count - 1
  2.             Dim write As String
  3.             write = ProgAnalizzato.Items.Item(i)
  4.             If write.startswith("Write")= true Then
  5.                 MsgBox("OK")
  6.                 Dim re2 As New Regex("'\w*'", RegexOptions.Compiled)
  7.                 Dim res As String = re2.Replace(ProgAnalizzato.Items.Item(i).ToString, "")
  8.                 ProgAnalizzato.Items.Item(i) = ""
  9.                 ProgAnalizzato.Items.Item(i) = res
  10.             End If
  11.         Next


Dovrebbe essere così...ho fatto a mente ma credo che la sintassi sia giusta :yup:

PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 23:43
Venerdì, 10/04/2009
Bene, ora l' if funziona grazie :)
Solo non va l' eliminazione >_<

PM
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 23:46
Venerdì, 10/04/2009
non va in che senso? semplicemente non elimina?

PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 23:47
Venerdì, 10/04/2009
Si, non elimina...

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:12
Sabato, 11/04/2009
Anche StartsWith è obsoleto: primo perchè il confronto è case-sensitive; secondo perchè in una riga come " case 1 : write(a); write(b);" non funziona.
Visto che usi le regex, facciamo tutto con le regex, no? Per prima cosa "\w*" indica zero o più lettere, quindi indica qualsiasi parola. Non so da dove tu l'abbia presa questa. Se vuoi individuare le scritte tra apici del write userai una regex del genere:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim re2 As New Regex("(?<Write>write(ln)?)\('.+?'\)", RegexOptions.IgnoreCase)


Questa regex individua ogni write o writeln seguito da una coppia di parantesi contenenti del testo tra apici. Con questa regex operi una sostituzione del genere:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim t As String = re2.Replace("Write('ciao'); writeln('coccdàa sj!!');", "${Write}('')")


${Write} serve a dire di mettere la stessa stringa trovata nel raggruppamento (?<Write>;), così i write rimangono write e i writeln rimangono writeln. L'unica cosa che modifichi è il parametro, che diventa una stringa vuota.

PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 15:47
Sabato, 11/04/2009
Avevo fatto in quel modo perchè avevo letto che "\w" indica una lettera e "*" zero o più ripetizioni quindi così avevo una parola di lunghezza n compresa tra due apici... e funziona se io metto nella listbox degli elementi predefiniti... comunque ho provato con il codice che mi hai dato tu (anche se ad essere sincero non l' ho capito tanto bene...). Ho fatto così:
Codice sorgente - presumibilmente VB.NET

  1. For i As Integer = 0 To ProgAnalizzato.Items.Count - 1
  2.             Dim re2 As New Regex("(?<Write>write(ln)?)\('.+?'\)", RegexOptions.IgnoreCase)
  3.             Dim t As String = re2.Replace(ProgAnalizzato.Items.Item(i), "${write}('')")
  4.             ProgAnalizzato.Items.Item(i) = ""
  5.             ProgAnalizzato.Items.Item(i) = t
  6.         Next


Solo che quando trova un Write, sostituisce tutta la riga mettendo "${write}('');" non so come fare... per favore puoi spiegarmi ?
Grazie 8-|

Ultima modifica effettuata da crash outside control il 11/04/2009 alle 15:48
PM
Pagine: [ 1 2 ] Precedente | Prossimo