Oppure

Loading
11/04/09 13:47
crash outside control
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ì:
   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 8-|
Ultima modifica effettuata da crash outside control 11/04/09 13:48
aaa
11/04/09 18:24
crash outside control
Ho risolto così:
For i As Integer = 0 To ProgAnalizzato.Items.Count - 1
            Dim write As String
            write = UCase(Mid(stringa(ProgAnalizzato.Items.Item(i)), 1, 5))
            If write.StartsWith("WRITE") = True Then
                Dim re2 As New Regex("'.+?'", RegexOptions.IgnoreCase)
                Dim t As String = re2.Replace(ProgAnalizzato.Items.Item(i), "")
                ProgAnalizzato.Items.Item(i) = ""
                ProgAnalizzato.Items.Item(i) = t
            End If
        Next

So che quell' if non è proprio la soluzione migliore, ma per il mio "stile" va bene perchè scrivo ogni istruzione su una nuova riga...

Mi potresti spiegare comunque cosa significa "+?"
"Lazy +; la prima corrispondenza che consuma il minor numero di ripetizioni possibili, ma almeno una"
Non mi è tanto chiaro...
Grazie mille a tutti :D
aaa
12/04/09 8:47
Il Totem
Postato originariamente da crash outside control:

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ì:
   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 8-|


No, il mio codice è esatto. Sei tu che hai sbagliato una lettera :D Infatti a causa del syntax highlighting del sito non si vede, ma essendo moderatore ho provato a fare "edit" del messaggio e ho notato l'errore. Infatti, la mia regex indica il gruppo di cattura con Write, mentre il tuo codice di sostituzione usa ${write}: hai messo la minuscola invece della maiuscola. Il case-insensitive è solo per le ricerca, ma i nomi dei gruppi che usi nella regex devono essere riportati fedelmente.

Per quanto riguarda il '.+?', in questo caso individua qualsiasi serie di caratteri ad eccezione dell'a capo, in numero uguale o superiore a uno, ma con il minor numero di caratteri. Ad esempio, se prendi questo codice:
write('a'); write('b');

e se usi solo '.+' al posto di '.+?', è probabile che ti restituisca come risultato una di queste stringhe che non c'entrano niente:
'a); write('
'a); write('b'

Se invece specifichi di prendere l'occorrenza col minor numero di caratteri avrai sempre, per forza, solo 'a' e 'b', perchè sono le sottostringhe più brevi che soddisfano il qualificatore.
aaa
12/04/09 11:19
crash outside control
Grazie mille Totem :k:
aaa