Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Regex e stringhe
Forum - C# / VB.NET - Regex e stringhe

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Jake7zDunn (Normal User)
Rookie


Messaggi: 30
Iscritto: 24/07/2012

Segnala al moderatore
Postato alle 23:56
Venerdì, 21/03/2014
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
Codice sorgente - presumibilmente Plain Text

  1. ##marco
  2. @luca
  3. ++giacomo
  4. ++filippo
  5. **bruce
  6. ++antonio
  7. ##stefano
  8. @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 il 21/03/2014 alle 23:57


I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L'insieme dei due costituisce una forza incalcolabile. [Albert Einstein]
http://adf.ly/KNVLD
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 0:31
Sabato, 22/03/2014
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 "++" || "@"?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Jake7zDunn (Normal User)
Rookie


Messaggi: 30
Iscritto: 24/07/2012

Segnala al moderatore
Postato alle 1:03
Sabato, 22/03/2014
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


I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L'insieme dei due costituisce una forza incalcolabile. [Albert Einstein]
http://adf.ly/KNVLD
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:29
Sabato, 22/03/2014
La Regex che ti serve è
Codice sorgente - presumibilmente Plain Text

  1. /^(.*(?:@|\+{2}).*)$/gm



La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Jake7zDunn (Normal User)
Rookie


Messaggi: 30
Iscritto: 24/07/2012

Segnala al moderatore
Postato alle 19:02
Sabato, 22/03/2014
Per farlo funzionare ho dovuto togliere "/^"e "$/gm" dall'espressione
Quindi il Regex è diventato:
Codice sorgente - presumibilmente Plain Text

  1. (.*(?:@|\+{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


I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L'insieme dei due costituisce una forza incalcolabile. [Albert Einstein]
http://adf.ly/KNVLD
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:12
Sabato, 22/03/2014
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)
http://www.regexr.com/
-Una delle guide che trovo più semplici e più completa che spiega l'uso delle regex
http://blog.chalda.it/guida-alla-sintassi-delle-espression ...

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

Ciao


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Jake7zDunn (Normal User)
Rookie


Messaggi: 30
Iscritto: 24/07/2012

Segnala al moderatore
Postato alle 0:47
Domenica, 23/03/2014
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:
Codice sorgente - presumibilmente VB.NET

  1. Dim Text As String = "##marco" + vbCrLf + "@luca" + vbCrLf + "++giacomo" + vbCrLf + "+filippo" + vbCrLf + "**bruce" + vbCrLf + "++antonio" + vbCrLf + "##stefano" + vbCrLf + "n@gianni"
  2. Dim R As New Regex("(.*(?:@|\+{2}).*)")
  3. Dim Matches As MatchCollection = R.Matches(Text)
  4. For Each M As Match In Matches
  5.     MsgBox(M.Groups(1).Value())
  6. 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 il 23/03/2014 alle 0:48


I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L'insieme dei due costituisce una forza incalcolabile. [Albert Einstein]
http://adf.ly/KNVLD
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 2:00
Domenica, 23/03/2014
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 il 23/03/2014 alle 2:03


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Jake7zDunn (Normal User)
Rookie


Messaggi: 30
Iscritto: 24/07/2012

Segnala al moderatore
Postato alle 17:52
Martedì, 25/03/2014
No è indifferente, ho provato a caricare un file con ReadAllText e funziona allo stesso modo. VbCrLf penso non centri, IMHO devono essere le funzioni vb.net per il Regex  che interpretano l'espressione regolare in quel modo.

Ero un po' curioso sull'argomento , quindi mi avrebbe fatto piacere se qualcuno di più informato avesse risposto. Comunque per il mio progetto attuale funziona perfettamente quindi grazie Roby94 :)


I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. L'insieme dei due costituisce una forza incalcolabile. [Albert Einstein]
http://adf.ly/KNVLD
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo