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:
Ebben az esetben a Regex konstruktorában a következő keresési szabályt adjuk meg:
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:
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