Oppure

Loading
21/03/14 22:56
Jake7zDunn
Avrei il bisogno di manipolare una stringa multilinea affinche mi restituisca un array contenente solo alcune linee contenenti parole specifiche

ad esempio ho questa stringa
##marco
@luca
++giacomo
++filippo
**bruce
++antonio
##stefano
@gianni


e vorrei inserire in un array solo le stringhe che contengono ++ o @
premetto che splittando la stringa linea per linea e usare string.contains lo so fare ma volevo qualcosa di più veloce dato che ho a che fare con stringhe di dimensioni molto grosse.
quindi avevo pensato ad un'espressione regolare che rimuovesse tutto a parte le linee contenenti ad esempio ++ o @ e poi usare split per ottenere rapidamente l'array.

non so illuminatemi o indirizzatemi dato che sul web non ho trovato cose molto utili.
Ultima modifica effettuata da Jake7zDunn 21/03/14 22:57
aaa
21/03/14 23:31
Roby94
Primissima cosa, attento a come usi il termine stringa, manderesti facilmente in confusione qualcuno...
Allora, si, con le Regex è una passeggiata, la domanda che ti devo porre però è, devi selezionare le "linee" che iniziano per "++" || "@" oppure che contengano "++" || "@"?
aaa
22/03/14 0:03
Jake7zDunn
beh in effetti il termine stringa l'ho usato un po' a sproposito xD.
comunque devo selezionare le linee che contengono "++" || "@" perché potrebbero non essere all'inizio della linea
es. jwfeweijf@wfgboiejwiof
aaa
22/03/14 15:29
Roby94
La Regex che ti serve è
/^(.*(?:@|\+{2}).*)$/gm
aaa
22/03/14 18:02
Jake7zDunn
Per farlo funzionare ho dovuto togliere "/^"e "$/gm" dall'espressione
Quindi il Regex è diventato:
(.*(?:@|\+{2}).*)


Premetto che non conosco molto di Regex quindi non so neanche che funzione avevano la parte iniziale e finale dell'espressione ma comunque per adesso funziona perfettamente
aaa
22/03/14 20:12
Roby94
Te lo spiego in breve...
La parte con "/" e "/gm" delimitano la regex, "g" indica che non dovrà fermarsi al primo risultato ma trovarli tutti, "m" indica che ogni riga dovrà essere trattata come stringa a sè.
Quindi dopo questo capisci che dato un input di stringa con molte righe ogni riga verrà processata come una stringa indipendente...
Iniziamo con la regex vera e propria... "^" indica l'inizio della stringa e "$" la fine quindi la regex deve funzionare dall'inizio alla fine della stringa.
Ora in ordine "(" definisce un nuovo gruppo (gruppo che conterrà la stringa se valida, "." indica ogni carattere, "*" indica che il precedente gruppo di caratteri (il punto ".";) deve essere trovato 0 o più volte, poi un altra "(" che insieme al "?:" non definisce più un gruppo ma solo una precedenza, una precedenza data a "@|\+{2}"... analizziamolo, è una condizione or "|" che implica di trovare o il carattere "@" o "\+{2}" scomponiamolo ulteriormente, "\+" indica di trovare il carattere "+", "{2}" esattamente 2 volte... poi chiudiamo la nostra precedenza ";)" di nuovo un ".*" identico a quello sopra e concludiamo chiudendo il gruppo ";)".
Credo di essere stato il più terra terra possibile ma se avessi qualsiasi dubbio, chiedi pure, ti lascio qualche link utile:
-RegExr (è un simulatore di regex che ti fa capire bene come opera la tua regex, ha un ottima funzione di debugger)
regexr.com/
-Una delle guide che trovo più semplici e più completa che spiega l'uso delle regex
blog.chalda.it/…

In ogni caso vorrei sapere come usi l'espressione regolare che ti è stata fornita (con quali funzioni) ;)

Ciao
aaa
22/03/14 23:47
Jake7zDunn
Innanzitutto grazie per la spiegazione molto dettagliata che mi ha fatto capire almeno le basi.
Ho usato la classe Regex nel namespace System.Text.RegularExpressions di .NET in questo modo per provare:
Dim Text As String = "##marco" + vbCrLf + "@luca" + vbCrLf + "++giacomo" + vbCrLf + "+filippo" + vbCrLf + "**bruce" + vbCrLf + "++antonio" + vbCrLf + "##stefano" + vbCrLf + "n@gianni"
Dim R As New Regex("(.*(?:@|\+{2}).*)")
Dim Matches As MatchCollection = R.Matches(Text)
For Each M As Match In Matches
    MsgBox(M.Groups(1).Value())
Next


Naturalmente grazie a te adesso ho almeno capito a cosa si riferiva quel Groups del match. Però mi sono sorti alcuni dubbi: "g" penso non serva perché usando "R.Matches(Text)" comprendo già tutti risultati, mentre "m", "^" e "$" non ho capito perché non servono. Se riesci a darmi una risposta su quest'ultimo punto te ne sarei davvero grato :love:

Ah e grazie per i link, davvero molto utili ! thx !
Ultima modifica effettuata da Jake7zDunn 22/03/14 23:48
aaa
23/03/14 1:00
Roby94
Prego, guarda ci sono rimasto un po' titubante pure io sul fatto che non gli servissero... adesso credo che il motivo stia in quel ritorno fatto con "vbCrLf" sinceramente il vb.net lo uso solo per aiutare la mia ragazza con un suo attuale programma, quindi non lo conosco troppo bene, io ho sempre vissuto di C#. Bisognerebbe informarsi su come si comporta il metodo Matches con questo elemento, aspettiamo che risponda qualcuno che conosca meglio l'argomento ;)

Edit:
Facciamo una cosa, proviamo ad escluderlo dall'equazione sostituendolo con il classico carattere "\n" e vediamo cosa succede. ;)
Ultima modifica effettuata da Roby94 23/03/14 1:03
aaa