İ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
String İçinde Arama ve Replace Olayı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: String İçinde Arama ve Replace Olayı
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 }
Re: String İçinde Arama ve Replace Olayı
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ı?
Re: String İçinde Arama ve Replace Olayı
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));