Friday, May 20, 2022 21:09

Cuprins >> Șiruri De Caractere Și Procesarea De Text > Căutarea unui string în interiorul altui string

Căutarea unui string în interiorul altui string

O altă operație foarte utilă în interacțiunea cu textul este căutarea unui anumit șir de caractere sau a unei litere în interiorul unui alt șir. Există mai multe moduri de a realiza acest lucru, fiecare având un comportament diferit.

Prima funcție pe care o putem folosi pentru a efectua o căutare este Contains(). Scopul său ar trebui să fie auto-descriptiv:

După cum puteți vedea, funcția Contains() necesită un parametru de tip string, care va fi chiar parametrul de căutare. Dacă șirul în care efectuăm căutarea conține șirul pe care îl căutăm, metoda va returna True, altfel False. Fiți atenți totuși, căutarea ține cont de majuscule și minuscule! Următorul exemplu va returna False, deoarece șirului comparat are structura diferită, datorita majusculelor și minusculelor:

Dacă vrem să efectuăm o căutare care nu ține cont de litere mari și mici, putem transforma șirul căutat în litere majuscule sau minuscule:

Observați nu numai faptul că rezultatul returnat va fi True în acest caz, dar și că putem să înlănțuim metodele de manipulare a șirurilor una după alta, ca în cazul lui ToLower() urmat de Contains().

Următoarea metodă de căutare a unui șir în alt șir este folosirea funcțiilor IndexOf(), LastIndexOf(), StartsWith() și EndsWith(). Spre deosebire de metoda anterioară, acestea nu vor returna un rezultat boolean la căutare, ci vor returna o valoare numerică indicând poziția șirului căutat în interiorul șirului în care căutăm. Să începem cu IndexOf():

Primul lucru evident este că rezultatul este stocat într-o variabilă int. După cum am spus, această funcție returnează o valoare numerică reprezentând locația termenului găsit. În prima utilizare, am căutat „Follow” și am obținut 0 ca valoare returnată. Acest lucru se datorează faptului că „Follow” a fost găsit exact la începutul expresiei în care căutăm. Indexarea numerică începe întotdeauna de la 0, nu de la 1! Și, de asemenea, dacă dorim să căutăm după mai mult de un singur caracter, dacă se găsește o potrivire, rezultatul va fi locația indexului primei litere a șirului căutat din interiorul șirului în care am căutat. Cu alte cuvinte, atunci când a căutat „Follow”, IndexOf() a găsit o potrivire și a returnat indexul primului caracter al termenului căutat, adică „F”, care, în interiorul variabilei str, este situat la indexul 0. Același lucru este valabil și pentru următoarea instrcțiune, atunci când am căutat „White”. Când IndexOf() a găsit o potrivire în interiorul str, a returnat indexul primei litere a termenului căutat, „W”, care se află la indexul 11 din str.

La fel ca și în cazul Contains(), IndexOf() ține cont de minuscule și majuscule. Aceasta înseamnă că atunci când am căutat „WHITE”, a returnat -1 ca rezultat. Această valoare poate fi citită întotdeauna și ca „nimic găsit”. Dacă vrem să efectuăm o căutare ce nu ține cont de litere mari și mici, putem folosi o supraîncărcare a funcției IndexOf(), care ne permite să specificăm că nu dorim să să se țină cont de acest aspect.

Dacă acordați atenție ultimelor trei căutări, veți realiza că variabila noastră str conține două apariții ale caracterului „o”. Cum găsim locația celui de-al doilea? Dacă efectuăm o căutare obișnuită, vom obține întotdeauna 1 ca rezultat, ceea ce este de așteptat. Ce putem face în acest caz este utilizarea unei supraîncărcări a funcției IndexOf(), care ia un număr ca parametru ce indică indicele de la care vrem să începem căutarea, sau ceea ce se numește o compensare (offset). Când am folosit str.IndexOf("o", 2); i-am spus compilatorului că dorim să găsim prima apariție a literei „o” în interiorul string-ului str, dar pornind de la poziția 2 din interiorul acestuia, care este caracterul „l”. Aceasta a returnat 4, deoarece primul „o” după „l” este localizat la acel index. Deci, chiar dacă specificăm o compensare pentru căutarea noastră, vom obține în continuare poziția din întreaga variabilă str, nu din compensarea pe care am specificat-o! Această compensare este utilizată numai pentru a indica indicele de la care ar trebui să se înceapă căutarea.

O altă supraîncărcare a IndexOf() ne permite să specificăm și un număr de caractere pe care dorim să le examinăm, pe lângă indexul compensat. Acest lucru este realizat în exemplul nostru în ultima căutare, unde căutăm șirul „o” începând de la indexul 2, dar numai în următoarele două caractere care urmează după acel index. În interiorul variabilei str, indexul 2 este ocupat de prima literă „l”, dar este considerat în fața acesteia. De aceea, încă două caractere din acea locație va însemna indicele care se află chiar înaintea celei de-a doua litere „o” și, prin urmare, rezultatul va fi în continuare -1, deoarece nu există „o” în acel interval.

LastIndexOf() funcționează pe același principiu ca și IndexOf(), dar va returna întotdeauna poziția ultimei apariții a termenului căutat din interiorul șirului căutat. Rețineți că indexul este poziția primului caracter căutat, deci în cazul în care căutați un șir compus din mai multe caractere, dacă doriți să aflați poziția de la sfârșitul șirului căutat, trebuie să adăugați și lungimea termenului căutat. De exemplu:

În exemplul de mai sus, am căutat ultima apariție a „bb”, care a fost găsită la indexul 19. Aceasta poate fi mai bine vizualizată dacă afișăm array-ul de caractere al șirului:


Dacă dorim să obținem poziția de la capătul șirului căutat (după „bb”), trebuie să adăugăm 2 la indexul găsit (pentru că am căutat după 2 caractere), ceea ce a dus la indexul 21, ocupat de litera „i”. Ca și în cazul IndexOf(), putem specifica de asemenea un offset și un număr de caractere ce urmează după respectivul offset și în care dorim să căutăm.

StartsWith() și EndsWith() verifică dacă un șir începe sau se termină cu șirul pe care îl căutăm. Ele returnează o valoare booleană:

Iată rezultatul:

Tags: , , , , , ,

Leave a Reply



Follow the white rabbit