s := StringReplace(s,'ali','veli',[rfReplaceAll, rfIgnoreCase]);
şeklinde yazdığım zaman sözcükler içerisinde de bulunan 'ali' leri de "veli" lerle değiştiriyor örneğin"zerdali" sözcüğünü zerdveli olarak değiştiriyor. Oysa benim istediğim sadece ali, ALİ, Ali sözcüklerinin yerine "veli" getirmek istiyorum. Visual Basic'de bunu şöyle yapıyordum;
- rfReplaceAll ve rfIgnoreCase belirteçleri kullanırken dikkatli olursanız aslında sorun olmayan sorununuzu çözmüş olursunuz.
- rfReplaceAll flağını kullanarak forced (zorunlu) yapılması gereken demişsiniz. Halbu ki zorunluluk burada kelime içinde geçenlerin kapsanıp kapsanmaması tercihiniz olduğunu biliniz...
- Bu flağı kaldırırsanız sadece kelimelere bakılır...
// Edit //
Yukarda yazdığım ifade hatalıdır... Lütfen dikkate almayınız...
Saygılarımla @mrmcop
En son mrmarman tarafından 24 Şub 2005 12:24 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
mrmcop yazdı:
- rfReplaceAll ve rfIgnoreCase belirteçleri kullanırken dikkatli olursanız aslında sorun olmayan sorununuzu çözmüş olursunuz.
- Bu flağı kaldırırsanız sadece kelimelere bakılır...
demişsiniz. Doğrusu çözemedim. Hatta şöyle bir kod denedim. Bu da aynı sonucu veriyor.
Bunu StringReplace ile yapamazsın. Önce metini kelime kelime ayırmalısın. Bunu yapmazsan zerdali'deki ali de değişecektir. Sanki makalelerde metni kelime kelime ayırma gibi bir kod görmüştüm.
"Ali Zerdali ali ahmet aliye" gibi bir metin olsun.
Bir döngü içinde kelime kelime ayırınca, kelimeleri tek tek elde edebileceksin. Bu sayede ali'ye eşit olanları değiştirebileceksin.
s := StringReplace(s,'$ali$','$veli$',[rfReplaceAll]);
şeklinde yapılırsa cümle içerisinde kelime olarak geçen bütün aliler başarılı bir şekilde veli olur. manuel olarak bir de cümlenin başında ve sonunda ali geçiyor mu diye kontrol ederseniz istediğiniz olmuş olur. daha sonradan işin içine noktalama işaretleri girerse onlar için de biraz uğraşmak gerekir.
$ = boşluk
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.
Arkadaşlar true değer nasıl döndürebiliriz?
Burda True değer döndürmek ihtiyacı hasıl olmuştur, aşağıda yarım kalmış fonksiyon üzerinden replace işleminin yapıldığını yapıldıysa true yapılmadıysa false değer döndürmesinide istiyorum
procedure TForm1.Button1Click(Sender: TObject);
function Replace(AText, BText, CText: String): Boolean;
var
ReplacedText: String;
begin
ReplacedText := StringReplace(AText, BText, CText, [rfReplaceAll]);
Result := not SameText(AText, ReplacedText);
end;
begin
if Replace('ALI TOPU TUT', 'ALI', 'VELI') then
ShowMessage('Degisti')
else
ShowMessage('Degisen Yok');
end;
s := StringReplace(s,' ali',' veli',[rfReplaceAll, rfIgnoreCase]);
bu kez ali satırın başındaysa veli olmuyor
Bu sorun için de şu şekilde bir çözüme gidebilirsin.
Stringin başına ve sonuna birer boşluk ekle.
Sonra da tüm ' ali ' leri ' veli ' lerle değiştir.
Son olarak da eklediğin baş ve sondaki boşluğu sil.
function Replace(AText, BText, CText: String): Boolean;
var
ReplacedText: String;
begin
ReplacedText := StringReplace(AText, BText, CText, [rfReplaceAll, rfIgnoreCase]);
Result := not SameText(AText, ReplacedText);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aranan,degisen:STRING;
begin
aranan:=EDIT1.Text;
if Replace(EDIT1.TEXT , '.', ',')<>true then BEGIN
// ShowMessage('Degisen Yok');
end;
if Replace(aranan , '.', ',')=true then BEGIN
degisen:=StringReplace(aranan, '.', ',',[rfReplaceAll, rfIgnoreCase]);
//showMessage('Degisti');
EDIT1.Text:=degisen;
MEMO1.Lines.Add(degisen);
End;
İstediğim buydu, kendime göre biraz düzenledim ve result deyiminin fonksiyon içindeki boolean olarak döndüğünü anladım . Teşekkürler