String İçinde Arama ve Replace Olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fox
Üye
Mesajlar: 78
Kayıt: 24 Nis 2006 08:28

String İçinde Arama ve Replace Olayı

Mesaj gönderen fox »

İyi günler benim 2 tane sorum olacaktı
1. si ben bir string içinde veri aratmak istiyorum. Örneğin 3. araba kelimesini bul demek istiyorum bunun için şöyle bir yöntem geliştirdim.

for i:0 to 2 do
begin
poz:=pos('araba',metin)
metin:=copy(metin,poz+1,10000)
end;

ama bu ifade (for döngüsü için)3 e kadar problem çıkarmıyor ama bu sayı 200 gibi büyük olunca performans kaybediyorum. Bunun başka bir yolu var mıdır?

2. Sorum ise

yukarıdaki arama matığıyla ';' gördüğüm yerleri '@' bu işarete çevirmek istiyorum. Ama dediğim gibi sayı arttıkça işlem çok uzuyor ama bunu dandik bir notepad bile 1 saniye içinde değiştirebiliyor. Bunu nasıl başarabiliyor

İyi günler

NOT: Kodlar yanımda olmadığı için üstteki kod yanlış yazmış olabilirim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: String İçinde Arama ve Replace Olayı

Mesaj gönderen Lost Soul »

fox yazdı:İyi günler benim 2 tane sorum olacaktı
1. si ben bir string içinde veri aratmak istiyorum. Örneğin 3. araba kelimesini bul demek istiyorum bunun için şöyle bir yöntem geliştirdim.

for i:0 to 2 do
begin
poz:=pos('araba',metin)
metin:=copy(metin,poz+1,10000)
end;

ama bu ifade (for döngüsü için)3 e kadar problem çıkarmıyor ama bu sayı 200 gibi büyük olunca performans kaybediyorum. Bunun başka bir yolu var mıdır?

2. Sorum ise

yukarıdaki arama matığıyla ';' gördüğüm yerleri '@' bu işarete çevirmek istiyorum. Ama dediğim gibi sayı arttıkça işlem çok uzuyor ama bunu dandik bir notepad bile 1 saniye içinde değiştirebiliyor. Bunu nasıl başarabiliyor

İyi günler

NOT: Kodlar yanımda olmadığı için üstteki kod yanlış yazmış olabilirim

Kod: Tümünü seç

StringReplace(metin,';','@',[rfReplaceAll]); {rfIgnoreCase  }
fox
Üye
Mesajlar: 78
Kayıt: 24 Nis 2006 08:28

Re: String İçinde Arama ve Replace Olayı

Mesaj gönderen fox »

Cevabın için teşekkür ederim En kısa zaman içinde deneyeceğim. Sonucu burda paylaşırım. Peki 1. Sorum için bir öneriniz varmı?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: String İçinde Arama ve Replace Olayı

Mesaj gönderen Lost Soul »

Kod: Tümünü seç

function NextPos(SubStr: AnsiString; Str: AnsiString; LastPos: DWORD
  = 0): DWORD;
type
  StrRec = packed record
    allocSiz: Longint;
    refCnt: Longint;
    length: Longint;
  end;

const
  skew = sizeof(StrRec);

asm
  // Search-String passed?
  TEST    EAX,EAX
  JE      @@noWork

  // Sub-String passed?
  TEST    EDX,EDX
  JE      @@stringEmpty

  // Save registers affected
  PUSH    ECX
  PUSH    EBX
  PUSH    ESI
  PUSH    EDI

  // Load Sub-String pointer
  MOV     ESI,EAX
  // Load Search-String pointer
  MOV     EDI,EDX
  // Save Last Position in EBX
  MOV     EBX,ECX

  // Get Search-String Length
  MOV     ECX,[EDI-skew].StrRec.length
  // subtract Start Position
  SUB     ECX,EBX
  // Save Start Position of Search String to return
  PUSH    EDI
  // Adjust Start Position of Search String
  ADD     EDI,EBX

  // Get Sub-String Length
  MOV     EDX,[ESI-skew].StrRec.length
  // Adjust
  DEC     EDX
  // Failed if Sub-String Length was zero
  JS      @@fail
  // Pull first character of Sub-String for SCASB function
  MOV     AL,[ESI]
  // Point to second character for CMPSB function
  INC     ESI

  // Load character count to be scanned
  SUB     ECX,EDX
  // Failed if Sub-String was equal or longer than Search-String
  JLE     @@fail
@@loop:
  // Scan for first matching character
  REPNE   SCASB
  // Failed, if none are matching
  JNE     @@fail
  // Save counter
  MOV     EBX,ECX
  PUSH    ESI
  PUSH    EDI
  // load Sub-String length
  MOV     ECX,EDX
  // compare all bytes until one is not equal
  REPE    CMPSB
  // restore counter
  POP     EDI
  POP     ESI
  // all byte were equal, search is completed
  JE      @@found
  // restore counter
  MOV     ECX,EBX
  // continue search
  JMP     @@loop
@@fail:
  // saved pointer is not needed
  POP     EDX
  XOR     EAX,EAX
  JMP     @@exit
@@stringEmpty:
  // return zero - no match
  XOR     EAX,EAX
  JMP     @@noWork
@@found:
  // restore pointer to start position of Search-String
  POP     EDX
  // load position of match
  MOV     EAX,EDI
  // difference between position and start in memory is
  //   position of Sub
  SUB     EAX,EDX
@@exit:
  // restore registers
  POP     EDI
  POP     ESI
  POP     EBX
  POP     ECX
@@noWork:
end; 

Kullanımı


Kod: Tümünü seç

HedeflenenRakam : integer;
i:integer;
pozisyon: integer;


HedeflenenRakam :=3;
pozisyon:=0;

For i : 1 to HedeflenenRakam do
      Begin
      pozisyon:=NextPos(ArananKelime, ArananMetin,pozisyon) // normal pos komutuna ek olarak en son pozisyon üçüncü parametre olarak aranır.
      if pozisyon =0 then break; // bunu koymamızdaki amaç: eğer fonksiyon belirlenen pozisyondan sonra bişey bulamadıysa sıfır değerini döndür sıfırı görünce for döngüsünü bırakıyoruz. 
      End;
if pozisyon<=0 then showmessage ('O kadar elimizde kalmadı')
else Showmessage('Aha burada:'+ inttostr (pozisyon));
dilerseniz i değerini yazdırarak en son kaçıncı aranan kelimeye ulaştığını da bulabilirsiniz.
Cevapla