Tam Sürümünü Görmek İçin : C de regex nasıl kullanılır.?
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
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
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
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
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.