Sorrere il testo

giovedì 27 marzo 2008 - 18.22

TaiChi Profilo | Junior Member

È possibile scorrere il testo di una stringa dall'inizio alla fine per individuare alcuni caratteri che ho nella stringa ma che non so di preciso dove sono?

Chiedo questo perchè ho bisogno di suddividere una stringa in più sottostringhe contenenti parole racchiuse tra { } e [ ] che si trovano in più punti della stringa ma senza poter sapere a priori in che posizione.

Grazie per l'aiuto.
Alessio Forconi

aiedail92 Profilo | Expert

Ciao

Potresti usare la funzione IndexOf della stringa da cercare, ripetendola successivamente, e passando come parametro il carattere da cercare e l'indice dell'ultimo carattere trovato aumentato di uno. Così, volendo ad esempio ottenere tutti gli indici dei caratteri '|' da una stringa, procederesti in questo modo:

string s = "str1|str2|test1|test2|prova1|prova2"; int index = s.IndexOf('|'); //Se l'indice è -1 significa che //non è stata trovata nessuna corrispondenza while (index != -1) { index = s.IndexOf('|', index + 1); //Qui esegui il lavoro che devi fare con l'indice ottenuto }

Luca

freeteo Profilo | Guru

ciao,
puoi sempre vedere la stringa come un array di caratteri (char), quindi puoi usare del codice come:

foreach(char c in stringa)
....

pero' è poco pratico.
Ti consiglio di usare le RegularExpression, un motore potentissimo per fare parsing di stringhe, e trovare quello che ti serve, gia incluso nel framework sotto il namespace "System.Text.RegularExpressions".
il concetto base è che definisci un "pattern" (con la sintassi propria delle Regex) e poi vai ad iterare sui suoi "match" ovvero tutte le occorrenze all'interno della stringa che gli passi.

Un esempio per quello che vuoi fare tu:
Regex reg = new Regex(@"{\w*}", RegexOption.Multiline | RegexOptions.IgnoreCase); foreach(Match m in reg.Matches(".....stringa....") m.Value <<<--- questo è quello che ti trova m.Index <<<--- se vuoi sapere a che carattere l'ha trovato

con questo strumento complesso per la sintassi di definizione dei pattern, puoi faer veramente tutto quello che vuoi...


Info varie:
http://it.wikipedia.org/wiki/Regular_expression
http://www.regular-expressions.info/
http://msdn2.microsoft.com/en-us/library/30wbz966(VS.71).aspx


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

TaiChi Profilo | Junior Member

>ciao,

>Ti consiglio di usare le RegularExpression, un motore potentissimo
>per fare parsing di stringhe, e trovare quello che ti serve,
Ottimo consiglio Matteo, sono davvero potenti, grazie.

>Un esempio per quello che vuoi fare tu:
>
>Regex reg = new Regex(@"{\w*}", RegexOption.Multiline | RegexOptions.IgnoreCase);
>foreach(Match m in reg.Matches(".....stringa....")
> m.Value <<<--- questo è quello che ti trova
> m.Index <<<--- se vuoi sapere a che carattere l'ha trovato
>

L'unico problema e chè non esce più dal ciclo, continua a iterare nella stringa, arriva alla fine e ricomincia da capo.

Fermo restando che io so quante occorrenze ci sono nella stringa e posso quindi sapere quando sono state trovate tutte le occorrenze con Count e uscire dal ciclo mi chiedevo se è possibile sapere quando si è raggiunta la fine della stringa e uscire a prescindere dalle occorrenze trovate.

C'è da dire che l'ultima occorrenza non si troverà mai alla fine della stringa quindi potrebe essere un problema riuscirci.

Grazie comunque perchè anche così ho già risolto il problema

Alessio Forconi

freeteo Profilo | Guru

>Ottimo consiglio Matteo, sono davvero potenti, grazie.
eh si io quando posso le uso sempre...anche perche' se risalgono al 1950 e sono validissime ancora oggi, forse ci sara' un motivo


>L'unico problema e chè non esce più dal ciclo, continua a iterare
>nella stringa, arriva alla fine e ricomincia da capo.
da me esce sempre, come mai non esce...mmm...prova a postare 1po di codice che valutiamo se c'e' qualcosa di particolare.


>C'è da dire che l'ultima occorrenza non si troverà mai alla fine
>della stringa quindi potrebe essere un problema riuscirci.
certo...cmq si deve uscire dal foreach, perhce' il numero di occorrenze è sempre finito, e lui lo sa in partenza, a meno che tu non vai a cambiare la che gli passi dentro al ciclo...fai cosi' percaso?
Se devi fare qualche operazione, tipo replace, puoi usare il metodo ominimo, senza iterare per modificare...cmq posta il codice cosi' si capisce meglio.


>Grazie comunque perchè anche così ho già risolto il problema
ok, se hai trovato utile la risposta accettala cosi' marchiamo il thread come risolto.
Grazie


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

TaiChi Profilo | Junior Member


Il codice è questo, come vedi non è nulla di strano.....

Regex reg = new Regex(@"\b\d{6}\b", RegexOptions.Multiline |
RegexOptions.IgnoreCase);

MatchCollection matches = reg.Matches(Valori);

foreach (Match match in matches)
{
qui faccio le mie cose
...
...

} //non esce mai da qui


ciao

Alessio Forconi

freeteo Profilo | Guru

>Regex reg = new Regex(@"\b\d{6}\b", RegexOptions.Multiline |
> RegexOptions.IgnoreCase);
>
> MatchCollection matches = reg.Matches(Valori);
>
> foreach (Match match in matches)
> {
> qui faccio le mie cose
> ...
> ...
>
> } //non esce mai da qui
credo a quello che dici ma la cosa è assurda!
Se debugghi, quanto vale matches.Count prima di entrare nel foreach? Il valore deve essere finito...non puo' girare per sempre...


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

TaiChi Profilo | Junior Member

>>Regex reg = new Regex(@"\b\d{6}\b", RegexOptions.Multiline |
>> RegexOptions.IgnoreCase);
>>
>> MatchCollection matches = reg.Matches(Valori);
>>
>> foreach (Match match in matches)
>> {
>> qui faccio le mie cose
>> ...
>> ...
>>
>> } //non esce mai da qui
>credo a quello che dici ma la cosa è assurda!

Ehm... diciamo che è stata una svista, non mi ero accorto di un'altro ciclo in un'altro metodo che chiama questo metodo.... in realtà esce da cilco ma ci reintra finchè non è finito quello chiamante... tutto ok!!!
Alessio Forconi

freeteo Profilo | Guru

ah ok, nessun problema, mi sembrava una cosa impossibile

Se trovato utile una risposta, accettala, cosi' marchiamo il thread come risolto.
Grazie

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5