HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Szabályalapú keresés sztringekben


Példaprogram letöltése

6666 bájt

Adott egy szöveg. Adott egy keresési feladat. E kettőt összehozni nehéznek tűnhet, de a Visual Studio.NET-ben van két osztály, mellyel gyerekjáték bármilyen szövegben, bármilyen bonyolultságú keresési feltételnek megfelelő módon megtalálni a szükséges szövegrészeket.

Az egyik osztály a Regex, mellyel a keresési feltételt definiálhatjuk és elvégezhetjük, a másik a Match osztály, mely az eredményt tárolja.
Vágjuk rögtön a közepébe és kezdjük egy egyszerű keresési példával:
Adott egy sztring, melyben keressük az „xy” betűpáros előfordulását. Ehhez létrehozunk egy Regex osztályt, melynek konstruktorában megadjuk az „xy” szöveget.
  Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
    Dim r As New Regex(button1.Text) 
Majd meghívjuk a Regex osztály Match nevű függvényét, melynek paraméterként azt a szöveget kell megadnunk, melyben a keresést kell elvégezni. Visszatérési értékként kapunk egy Match osztályt. Ha ennek Success property-je igaz, akkor van eredményes találat, melyet az Index property-ből olvashatunk ki. Az innen kiolvasott szám a keresett sztringben jelöli annak a karakternek a sorszámát, ahol a keresett szöveg megtalálható.
    Dim m As Match = r.Match(label1.Text)
    If m.Success Then
      label2.Text = m.Index.ToString()
    End If
  End Sub 'button1_Click
Abban az esetben, ha a szövegben nem csak egy találatra számíthatunk, hanem többre, akkor a Match függvény helyett használjuk a Matches függvényt, mely egy kollekciót ad vissza a találatokról.
E példában keressük a szövegben az „55” előfordulásait. Ehhez szintén létrehozunk egy Regex osztályt. Majd meghívjuk annak Matches függvényét, eredményül pedig kapunk egy MatchCollection osztályt.
  Private Sub button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button2.Click
    Dim r As New Regex(button2.Text)
    Dim mc As MatchCollection = r.Matches(label4.Text) 
Most egy ciklussal végigmehetünk ezen a kollekción és kiolvashatjuk a találatokat. A kollekció elem száma a Count property-ből határozható meg. Ez esetben szintén az Index property adja a találati helyet.
    For i = 0 To mc.Count - 1
      listBox1.Items.Add(mc(i).Index.ToString())
    Next i
  End Sub 'button2_Click
Most végezzünk el egy összetettebb keresést. Legyen az a feladat, hogy egy szövegben keresünk olyan sztringeket, mely az alábbiak egyikének felel meg:
  • a1b
  • a2b
  • a3b
Ebben az esetben a Regex konstruktorában a következő keresési szabályt adjuk meg:
a(1|2|3)b
A keresési feltétel elején lévő „a” és a végén lévő „b” betű nem szorul különösebb magyarázatra: ezt keressük. A kettő között egy zárójelet használunk és benne egy kifejezést. A zárójelben lévő kifejezés a keresés során kiértékelődik, és eredménye behelyettesítésre kerül a zárójel helyére. A kifejezésben a „vagy” műveletet használjuk, melynek a | karakter a jele, valamint felsoroljuk a lehetséges karaktereket, az 1, 2, 3-at. Ennek hatására minden olyan karakterlánc eredményt ad, mely a fenti felsorolásnak megfelelő. A keresés végrehajtása ugyanúgy zajlik, mint az előző példa esetén.
  Private Sub button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button3.Click
    Dim r As New Regex(button3.Text)
    Dim mc As MatchCollection = r.Matches(label5.Text)
    Dim i As Integer
    For i = 0 To mc.Count - 1
      listBox2.Items.Add(mc(i).Index.ToString())
    Next i
  End Sub 'button3_Click
A keresési feltételt szinte a végtelenségig bonyolíthatjuk. Ráadásul a művelet nem csak a keresésben merülhet ki, hanem az eredményként talált csoportok meghatározásában is. Legyen a következő a feladat: adott egy IP cím, melyet fel kell bontanunk négy számra. Ebben az eseten a 212.40.65.11 cím esetén az alábbi listát szeretnénk viszontlátni:
  • 212
  • 40
  • 65
  • 11
Mivel az IP címnél egy-egy szám lehet egy-, kettő- vagy háromjegyű, így bonyolódik a helyzet. Persze ezt a feladatot elvégezhetnénk úgy is, hogy az IP cím sztringjét a benne lévő pont karakterek mentén bontanánk fel, de hát úgy túl egyszerű lenne az élet...
Az alábbi Regex konstruktor megadása elvégzi az IP cím felbontását számokra. A Match függvényt futtatva megtörténik a keresés. Ezt követően a Match osztály Groups property-jét használva kiolvashatjuk az egyes találati csoportokat. Mivel egy IP címben négy ilyen számkarakterekből álló csoport van, így a Groups tömbjében is négy elemet olvasunk ki.
  Private Sub button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button4.Click
    Dim r As New Regex("^([01]?\d\d|2[0-4]\d|25[0-5])\.([01]?\d\d|2[0-4]\d|25[0-5])\.([01]?\d\d|2[0-4]\d|25[0-5])\.([01]?\d\d|2[0-4]\d|25[0-5])$")
    Dim m As Match = r.Match(textBox1.Text)
    listBox3.Items.Add(m.Groups(1))
    listBox3.Items.Add(m.Groups(2))
    listBox3.Items.Add(m.Groups(3))
    listBox3.Items.Add(m.Groups(4))
  End Sub 'button4_Click

Cikksorozat

#IDKategóriaCikk címeSorozat
4397Windows.NET Framework konfigurálása az operációs rendszerben1. rész
4446Windows.NET Framework konfigurációs snap-in2. rész


Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |