May 03, 2011

Alıntı (erdem):

>

regexp'den bahsediyorsunuz sanırım.

Vakit bulduğunda şuradaki yazıya bakar mısın; D2 ile uyumlu mu?

http://ddili.org/makale/duzenli_ifadeler.html

D1 için yazılmış olduğunu biliyorum; D2 başkaysa düzeltelim.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 04, 2011

Bu şekilde etiketleri de arayıp istediğimiz metni elde edebiliyoruz.

   auto dizi ="<b>matematiğe benzer</b>";

   auto r1 = match(dizi, regex("<.>"));
   dizi = r1.post;

   auto r2 = match(dizi, regex("</.>"));
   dizi = r2.pre;

   writeln(r1.hit);
   writeln(r2.hit);

   writeln("dizinin son durumu:", dizi);

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 04, 2011

Alıntı (erdem):

>

Bu şekilde etiketleri de arayıp istediğimiz metni elde edebiliyoruz.

>     auto dizi ="<b>matematiğe benzer</b>";
>
>     auto r1 = match(dizi, regex("<.>"));
>     dizi = r1.post;
>
>     auto r2 = match(dizi, regex("</.>"));
>     dizi = r2.pre;
>
>     writeln(r1.hit);
>     writeln(r2.hit);
>
>     writeln("dizinin son durumu:", dizi);
>
> ```

>

regex ile html parse etmek hic tavsiye edilmiyor, onun yerine html parserlar tavsiye ediliyor.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
May 04, 2011

Metni ayrıştırma kısmı da şık bir çözüm olmasa da şunun gibi oldu:

import std.string, std.stdio, std.regex;

string[] düzenlimetin;

void ayrıştır (string şimdiki, string sonraki) {

   string sonuç = şimdiki;
tekrar:
   auto başlangıç = match(sonuç, regex("<.>"));
   auto bitiş = match(sonuç, regex("</.>"));

   if (!başlangıç.empty
       &&
       !bitiş.empty) {
       sonuç = başlangıç.post;
       bitiş = match(sonuç, regex("</.>"));
       sonuç = bitiş.pre;

       // .. aşağıdakinin aynısı
       düzenlimetin ~= sonuç;

   } else if (!başlangıç.empty
              &&
              bitiş.empty) {
       sonuç ~= " " ~ sonraki;
       goto tekrar;
   } else {
       düzenlimetin ~= sonuç;
       // aslında buraya DüzenliMetin'i oluşturan kod gelecek
   }
}

void main() {

   auto s4  = "<b>matematige";
   auto s5  = "benzer</b>";
   auto s6  = "sekilde";
   auto s7  = "<u>bilgisayar</u>";
   auto s8  = "bilimi";
   auto s9  = "bilginin,";
   auto s10 = "<p>ozellikle";
   auto s11 = "elektronik";
   auto s12 = "makineler";
   auto s13 = "araciligiyla</p>";

   ayrıştır(s4, s5);

   writeln("Düzenlenmiş:", düzenlimetin);
}

Burada for döngüsünde bir sonraki kelimeye de erişebileceğimizi düşünerek yazdım.

   foreach (kelime; kelimeler) {
// ...
   }

Umarım erişebiliyoruzdur :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 04, 2011

Alıntı (Mengu):

>

regex ile html parse etmek hic tavsiye edilmiyor, onun yerine html parserlar tavsiye ediliyor.

Bir örnek yazabilirsen sevinirim.

Bir de aslında bu bir html dökümanı değil. Html ile metin'in karışımı gibi bir şey :D

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 04, 2011

Ben de regex'in kullanışsız olacağını düşünüyorum. Yukarıdaki bir kod şu diziyi yanlış ayrıştırıyor:

   auto dizi ="<b>matematiğe <b>benzer</b></b>";

Bu sorunun asıl amacından uzaklaştığımızı farkettim. Aslında amaç metin dosyasını okumak.

Kadir Can'ın yöntemi doğru gibi. Tek fark, belirlediğimiz etiketlere karşılık özel bir nesne oluşturacağız. Bir de bu işi özyinelemeli olarak yapacağız.

Zaman bulunca daha çok yazacağım. Ama daha önce de söylediğim gibi, farklı ortamlara yazdırma işine de baktığımızda "double dispatch"le karşılaşacağız. "double", çünkü hem metin bir kalıtım sıradüzenine ait, hem de gösterici. Temiz çözümü olmayabilir. C++'ta bazen "visitor pattern" kullanılır. D'de daha iyi yöntemler olabilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2011

regex yerine özyinelemeli yöntemle bir kısmını tekrar yazdım. Ama hala içiçe elemanları yazdıramıyor.

import std.string, std.stdio, std.conv;

void main()
{
   string[] elemanlar;

   auto yazı = "Çorba yaparken <b>matematiğe </b><b>benzer çok şeyler </b> olduğunu"
   "biliyoruz<u>ama bunların<u> nasıl kullanılacağı</u></u>";

başlangıç:

   // ilk < karakterini ara konumunu kaydet
   auto ilk = yazı.indexOf('<');

   // ikinci < karakterini ara konumunu kaydet
   auto ikinci = yazı[ilk + 1 .. $].indexOf('<') + ilk + 1;

   if (ilk > 0) {  // sadece metin var
       auto metin = yazı[0 .. ilk];
       elemanlar ~= metin;
       yazı = yazı[ilk .. $];
       if (yazı.length <= 0) goto çıkış;
       goto başlangıç;

   }

   if (yazı[ikinci + 1] == '/') {      // tek bir html elemanı var
       //                           < >]
       auto eleman = yazı[ilk .. ikinci + 4];
       yazı = yazı[ikinci + 4 .. $];
       if (yazı.length <= 0) goto çıkış;
       goto başlangıç;

   } else {
       writeln ("içiçe geçmiş etiketler var bu kısım henüz hazır değil");
       writeln ("dizinin son hali: ", yazı);

   }

çıkış:
   writeln("çıkıyorum");
}

double dispatch konusuyla ilgili burada bazı şeyler okudum.

http://c2.com/cgi/wiki?DoubleDispatch

Ama gerçekleştirme ayrıntılarını ben de merak ediyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2011

Alıntı (acehreli):

>

Yazdığın kodları okuyor muyuz diye denemek için mi goto kullandın! :-p
Aslında C++'de zaten böyle bir olanak yoktu sanırım. Hatta 'goto' kullanmak ayıp bile karşılanıyordu :)

Ama D için böyle bir olanak olduğuna göre kullanayım diye düşündüm.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2011

'goto' ifadelerini attıktan sonra bu şekilde olmuş oldu:

import std.string, std.stdio, std.conv;

string[] elemanlar;

void main()
{
   auto yazı = "Çorba yaparken <b>matematiğe </b><b>benzer çok şeyler </b> olduğunu"
   "biliyoruz<u>ama bunların<u> nasıl kullanılacağı</u></u>";
   parçala(yazı);

}

void parçala(string yazı) {
   if (yazı.length > 0) {

       // ilk < karakterini ara konumunu kaydet
       auto ilk = yazı.indexOf('<');

       // ikinci < karakterini ara konumunu kaydet
       auto ikinci = yazı[ilk + 1 .. $].indexOf('<') + ilk + 1;

       if (ilk > 0) {  // sadece metin var
           auto metin = yazı[0 .. ilk];
           elemanlar ~= metin;
           yazı = yazı[ilk .. $];
           parçala(yazı);

       } else if (yazı[ikinci + 1] == '/') {      // tek bir html elemanı var
           auto eleman = yazı[ilk .. ikinci + 4];
           yazı = yazı[ikinci + 4 .. $];
           parçala(yazı);

       } else {
           writeln ("içiçe geçmiş etiketler var bu kısım henüz hazır değil");
           writeln ("dizinin son hali: ", yazı);
       }
   }
}

Aslında 'goto' 'lar biraz nostaljik oluyordu.

Bill amca.. Basic.. Bir de hiç modelini bile bilmediğim bir bilgisayarda Commodore'dan da önceydi galiba böyle 'goto' kullanan bir program yazmaya çalıştığımı hatırlıyorum! :D

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 05, 2011

Yazdığın kodları okuyor muyuz diye denemek için mi goto kullandın! :-p

Ben gerçekten buna bakacak zaman bulamıyorum ama ilginç bir tesadüf, yakın zaman önce okuduğum Overload'da sanal işlev ve şablonların karışık kullanımını içeren bir çözüm görmüştüm.

ACCU Overload'ları ücretsiz olarak da veriyor. Yazı şu:

http://accu.org/index.php/journals/1716

Belki bir fikir verir. (Bir kere daha okuyunca bana fikir verecek ama sonra okuyacağım. :))

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]