String Karşılaştırma İşlemleri Hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

String Karşılaştırma İşlemleri Hakkında

Mesaj gönderen adelphiforumz »

Selamlar

elimdeki "s : String" ve "ws : WideString" olarak iki değişkeni
içerisinde büyük/küçük harf ve başlangıç/bitiş gibi kurallara bakmaksızın
"s" değerinin "ws" içerisinde olup olmadığını karşılaştıran bir komut varmıdıdır.

benim denemelerimde aşağıdakiler ile sonuç alamadım.
illaki değerleri uppercase yapmak gerekiyor.

Pos -> küçük harf büyük harfe takılıyor
AnsiContainsStr, AnsiCompareStr -> başlangıç değerleri için boşluk arıyor ve küçük büyük ayırıyor

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: String Karşılaştırma İşlemleri Hakkında

Mesaj gönderen ertank »

Merhaba,

Büyük küçük harf duyarsız şekilde string karşılaştırması yapar iken mutlaka her ikisini de büyük veya her ikisini de küçük harf yapmalısınız. Bunun bilgisayarın anlayabileceği başka bir şekli yok. Ancak bu işlemi Pos() ile değil başka fonksiyonlar yardımı ile yaparsanız bu kullanılan fonksiyonlar arka planda büyük veya küçük harf dönüşümünü yapacaklardır.

Delphi 7 içinde mevcut mu emin değilim. Ancak yeni sürümler için aşağıdaki gibi bir kod yazabilirsiniz.

Kod: Tümünü seç

uses
  StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  TempString: string;
  TempWideString: WideString;
begin
  TempString := 'Üğ';
  TempWideString := 'Küçük büyük harf için "üğI" test';
  if ContainsText(TempWideString, TempString) then
  begin
    ShowMessage('Evet');
  end;
end;
Ancak Delphi içindeki bu standart fonksiyon aşağıdaki alternatrife göre yaklaşık 4 kat daha yavaş çalışmaktadır.

Kod: Tümünü seç

unit NewStrUtils;

interface

type
  TCharUpCaseTable = array [Char] of Char;

procedure InitCharUpCaseTable(var Table: TCharUpCaseTable);
function InsensPosEx(const SubStr, S: string; Offset: Integer = 1): Integer;

implementation

uses
  Winapi.Windows;

var
  CharUpCaseTable: TCharUpCaseTable;

procedure InitCharUpCaseTable(var Table: TCharUpCaseTable);
var
  I: Cardinal;
begin
  for I := 0 to Length(Table) - 1 do
    Table[Char(I)] := Char(I);
  CharUpperBuff(@Table, Length(Table));
end;

function InsensPosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
var
  n              :integer;
  SubStrLength   :integer;
  SLength        :integer;
label
  Fail;
begin
  SLength := length(s);
  if (SLength > 0) and (Offset > 0) then
  begin
    SubStrLength := length(SubStr);
    Result := Offset;
    while SubStrLength <= SLength - result + 1 do
    begin
      for n := 1 to SubStrLength do
        if CharUpCaseTable[SubStr[n]] <> CharUpCaseTable[s[result + n - 1]] then
          goto Fail;
      Exit;
Fail:
      Inc(result);
    end;
  end;

  Result := 0;
end;

initialization
  InitCharUpCaseTable(CharUpCaseTable);

end.
Kaynak: https://stackoverflow.com/questions/154 ... sitive-pos

Kullanımı Pos() fonksiyonu ile aynıdır ve aşağıdaki gibidir.

Kod: Tümünü seç

uses
  NewStrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  TempString: string;
  TempWideString: WideString;
begin
  TempString := 'Üğ';
  TempWideString := 'Küçük büyük harf için "üğI" test';
  if InsensPosEx(TempString, TempWideString) > 0 then
  begin
    ShowMessage('Evet');
  end;
end;
Her iki fonksiyon ile de yaşanacak sorun "ı" ve "İ" harfleri olacaktır. Bu iki fonksiyon da küçük "ı" veya büyük "İ" harfini Türkçe dil kurallarına göre dönüştürüp algılayamaz. Ancak sizin sorunuz içinde geçen UpperCase() veya LowerCase() fonksiyonlarında da aynı sorun mevcut olduğu için cevap veriyorum.
Cevapla