crash outside control (Normal User)
Expert
Messaggi: 217
Iscritto: 12/02/2008
|
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 |
For i As Integer = 0 To ProgAnalizzato.Items.Count - 1 Dim write As String write = Mid(LTrim(ProgAnalizzato.Items.Item(i)), 1, 5) If System.String.Compare(write, "write", False) Then MsgBox("OK") Dim re2 As New Regex("'\w*'", RegexOptions.Compiled) Dim res As String = re2.Replace(ProgAnalizzato.Items.Item(i).ToString, "") ProgAnalizzato.Items.Item(i) = "" ProgAnalizzato.Items.Item(i) = res End If 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
|
|
ruggy94 (Member)
Guru
Messaggi: 890
Iscritto: 21/04/2008
|
uhm...nell'if prova ad usare string.startswith()...se non hai capito dimmelo
|
|
crash outside control (Normal User)
Expert
Messaggi: 217
Iscritto: 12/02/2008
|
Non ho capito
|
|
ruggy94 (Member)
Guru
Messaggi: 890
Iscritto: 21/04/2008
|
Codice sorgente - presumibilmente VB.NET |
For i As Integer = 0 To ProgAnalizzato.Items.Count - 1 Dim write As String write = ProgAnalizzato.Items.Item(i) If write.startswith("Write")= true Then MsgBox("OK") Dim re2 As New Regex("'\w*'", RegexOptions.Compiled) Dim res As String = re2.Replace(ProgAnalizzato.Items.Item(i).ToString, "") ProgAnalizzato.Items.Item(i) = "" ProgAnalizzato.Items.Item(i) = res End If Next
|
Dovrebbe essere così...ho fatto a mente ma credo che la sintassi sia giusta
|
|
crash outside control (Normal User)
Expert
Messaggi: 217
Iscritto: 12/02/2008
|
Bene, ora l' if funziona grazie
Solo non va l' eliminazione >_<
|
|
ruggy94 (Member)
Guru
Messaggi: 890
Iscritto: 21/04/2008
|
non va in che senso? semplicemente non elimina?
|
|
crash outside control (Normal User)
Expert
Messaggi: 217
Iscritto: 12/02/2008
|
Si, non elimina...
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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 |
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 |
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. |
|
crash outside control (Normal User)
Expert
Messaggi: 217
Iscritto: 12/02/2008
|
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 |
For i As Integer = 0 To ProgAnalizzato.Items.Count - 1 Dim re2 As New Regex("(?<Write>write(ln)?)\('.+?'\)", RegexOptions.IgnoreCase) Dim t As String = re2.Replace(ProgAnalizzato.Items.Item(i), "${write}('')") ProgAnalizzato.Items.Item(i) = "" ProgAnalizzato.Items.Item(i) = t Next
|
Solo che quando trova un Write, sostituisce tutta la riga mettendo "${write}('');" non so come fare... per favore puoi spiegarmi ?
Grazie
Ultima modifica effettuata da crash outside control il 11/04/2009 alle 15:48 |
|