PDA

Tam Sürümünü Görmek İçin : C de regex nasıl kullanılır.?


xander
24/08/2006, 11:37
if (!strcasecmp(parv[2],"burada ki regex ile eşleştirmek istiyorum")) {

Regex ile eşleştirmek mümkünmü diyelimki
.+aliveli.+
ile eşleştirmek istiyorum.
Yardımlar için teşekkürler.


acehreli
24/08/2006, 13:27
Standart C'de regex yok, ama bunu yapan kutuphaneler mutlaka vardir. Google'da

regex library C

diye arayinca bulunuyor.

Durum C++'ta da ayni: onun icin de iyi bir regex kutuphanesi boost.org'da var.

Ali

xander
25/08/2006, 00:56
mesela
ali veli ali veli java@ mehmet ahmet
diye bir yazı var ve ben bu cümlede java@ geçiyor ise yakalamak istiyorum. regex olsaytı tutmak kolay ama regex olmadan nasıl tutabilirim ?

acehreli
25/08/2006, 01:09
Eger o kadar basitse strstr isine yarayabilir. strtok'a da bakabilirsin... Ikisi de <string.h> basligindalar...

Ali

xander
25/08/2006, 01:32
if (!strcasecmp(parv[2],"\1FINGER www.siteadi.com (java@) Idle 0 seconds\1")) {
sendto_one(cptr, ":%s NOTICE %s :*** Yasaklaniyorsunuz.", me.name, cptr->name);
return place_host_ban(sptr, BAN_ACT_GZLINE, "www.siteadi.com",86400);
}

mesela burda herkezden gelen finger cevabı aynı ama bir tek istemediğimde (java@) diye ek bir yazı var ve ben bunu tutmak istiyorum. Ne yapabilirim. Yukarda yaptığım şekilde tutmuyor. sadece gelen cevabın içinde java@ olanları tutmak istiyorum.

acehreli
25/08/2006, 02:02
strstr bu durumda ise yariyor. Su programda giristen icinde "java@" olan ve olmayan satirlar girerek deneyebilirsin:


#include <string.h>
#include <stdio.h>

void dene(const char * satir)
{
const char * yer = strstr(satir, "java@");

if (yer) {
printf("Buldum; su noktada basliyor: %s\n", yer);
}
else {
printf("Bulamadim\n");
}
}

int main()
{
char satir[100];
fgets(satir, sizeof(satir), stdin);
dene(satir);
}


Ali

acehreli
26/08/2006, 01:57
Hmmm... Bu is icin aslinda scanf ve arkadaslarinin az bilinen bir ozelligi bile ise yarayabilir. Cunku scanf bile kisitli da olsa regex becerir.

Eger "[%s FINGER reply]: %s (java@) %s" duzenine uyan satirlar diye tanimlamak isine yariyorsa, yapman gereken su:

1) Senin "if (!strcasecmp" karsilastirmasinin yapildigi islevden (function) once bir yerde su islevi tanimla:


/**
* Satiri tarar; eger "FINGER (java@)" satiri ise kullanici ve site bilgisini doldurur.
*
* @param satir Taranacak olan satir
* @param kullanici Satirdaki kullanici adi (ancak 1 donerse gecerli)
* @param site Satirdaki site adi (ancak 1 donerse gecerli)
*
* @return Istenen duzene uyarsa 1, uymazsa 0 dOndUrUr.
*/
int finger_java_satiri(const char * satir,
char * kullanici,
char * site)
{
// Bunun buyuklugu yetmeyebilir :)
char satirin_gerisi[1000];

const int donusum_sayisi =
sscanf(satir, "[%s FINGER reply]: %s (java@) %s",
kullanici, site, satirin_gerisi);

return (donusum_sayisi == 3);
}


2) Ondan sonra da karsilastirma satirini sununla degistir:


if (finger_java_satiri(satir, kullanici, site)) {


Yani kodun sonucta su sekilde olsun:


void sende_zaten_olan_islev(/* ... */)
{
// Basa bunlari ekle:
// Ama bunlarin buyuklugu yetmeyebilir de tabii... :)
char kullanici[1000];
char site[1000];

/* baska bazi satirlar */

if (finger_java_satiri(parv[2], kullanici, site)) {
sendto_one(cptr, ":%s NOTICE %s :*** Yasaklaniyorsunuz.", me.name, cptr->name);
return place_host_ban(sptr, BAN_ACT_GZLINE, site, 86400);
}

/* baska satirlar */
}


Ben su ornek kodu kullanarak denedim:


#include <string.h>
#include <stdio.h>

/**
* Satiri tarar; eger "FINGER (java@)" satiri ise kullanici ve site bilgisini doldurur.
*
* @param satir Taranacak olan satir
* @param kullanici Satirdaki kullanici adi (ancak 1 donerse gecerli)
* @param site Satirdaki site adi (ancak 1 donerse gecerli)
*
* @return Istenen duzene uyarsa 1, uymazsa 0 dOndUrUr.
*/
int finger_java_satiri(const char * satir,
char * kullanici,
char * site)
{
// Bunun buyuklugu yetmeyebilir :)
char satirin_gerisi[1000];

const int donusum_sayisi =
sscanf(satir, "[%s FINGER reply]: %s (java@) %s",
kullanici, site, satirin_gerisi);

return (donusum_sayisi == 3);
}

void dene(const char * satir)
{
// Bunlar da yetmeyebilir tabii...
char kullanici[1000];
char site[1000];

if (finger_java_satiri(satir, kullanici, site)) {
printf("BULDUM!\n kullanici: %s\n site: %s\n",
kullanici,
site);
}
else {
printf("Uymadi\n");
}
}

int main()
{
dene("[VERSION reply]:");
dene("[akin BIRSEY reply]: www.siteadi.com (java@) Idle 0 idle seconds");
dene("[akin FINGER reply]: www.siteadi.com Idle 0 idle seconds");
dene("[akin FINGER reply]: www.siteadi.com (java@) Idle 0 idle seconds");

return 0;
}


Ali

xander
26/08/2006, 23:59
humm. anladım.

uszr
27/08/2006, 00:29
ircd için kullanıyorsanız strstr fonksiyonu en basit ve hızlı çözüm olur.

acehreli
27/08/2006, 00:35
Keske nasil bir hata oldugunu da soyleseymissin. Yoksa isler cok zorlasiyor... :(

Yine de baktim ve benim 1 ve 2 ile numaralandirdigim adimlari isletmedigini; onun yerine son olarak verdigim ornek programi kullandigini farkettim.

Bu durumda hatanin, programinda iki tane 'main' islevi tanimlanmis olmasindan kaynaklandigini tahmin ediyorum. Tahmin! :(

Bence once 1 ve 2 numarali adimlari uygula, eger calismazsa ne hata oldugunu bize soyle.

Ali