2012-05-31 15 views
7

Dize'deki sayıları nasıl silebileceğimi bilmek istiyorum. StringReplace'ı kullanmayı deniyorum ve sayıları değiştirmek istediğim işlevi nasıl anlatacağımı bilmiyorum.Dize numaralarını silme

İşte denedim ne:

StringReplace(mString, [0..9], '', [rfReplaceAll, rfIgnoreCase]); 
+0

Eh, Delphi XE ve dize yerine kullanılabilmesi için düzenli bir desteği destekliyor. Bu RegularExpressions ve RegularExpressionsCore birimlerinde – Hendra

+0

Tamam teşekkürler, ben bir göz atacağım. – CharleyXIV

cevap

11

Basit ama etkili. Optimize edilebilir, ancak bir başlangıç ​​olarak ihtiyacınız olanı almalıyım:

function RemoveNumbers(const aString: string): string; 
var 
    C: Char; 
begin 
    Result := ''; 
    for C in aString do begin 
     if not CharInSet(C, ['0'..'9']) then 
     begin 
     Result := Result + C; 
     end; 
    end; 
end; 
+2

Bu, bunu yapmanın en kolay yolu ve en kısa kod olmalıdır. –

+0

Anlaşmalı. Her ne kadar ben düzenli ifadelerin büyük bir hayranıyım olsa da, Nick'in bu özel probleme çözümü çok daha hızlıdır. Daha karmaşık bir şey varsa ve bir kalp atışıyla RegEx ile giderim! Yerinde değişiklik için –

-1

StringReplace ikinci argüman olarak bir dizi kabul etmez. Belki birisi daha uygun bir yaklaşım olacaktır, ancak bu çalışır:

StringReplace(mString, '0', '', [rfReplaceAll, rfIgnoreCase]); 
StringReplace(mString, '1', '', [rfReplaceAll, rfIgnoreCase]);  
StringReplace(mString, '2', '', [rfReplaceAll, rfIgnoreCase]); 

vb

+4

Yuck! “DRY” diyebilir misin (kendini tekrar etme)? Üzgünüz, ama bu soruyu sormak için * korkunç * çözüm olarak reddetmeliyim. –

+0

Katılıyorum .. en azından döngü yapabilirsin .. i: = 0 ila 9 doDurumYeni (mString, I, '', [rfReplaceAll, rfIgnoreCase]); –

+0

Hey, Ken, bana kolay git! :-) "Korkunç?" Evet, bir for-loop'un avantajları var. Ancak bazen karmaşıklık eklemek hata ekler. John'un kodu (bunu yayınladıktan sonra düzenlemediği sürece) iyi bir örnek: ilk olarak, derleme başarısız. Tamsayı olması için "i" olduğunu varsayarsak, doğru kod biraz zordur. İkinci parametre chr (ord ('0') + i) olmalıdır, hayır? Veya for-döngüsü ch: = chr ('0') chr ('9') için olmalıdır. Her ikisi de biraz karmaşıklık katıyor ve doğrudan sorusuna doğrudan cevap vermiyor, StringReplace'ı nasıl kullanacağınız. OP'nin önerdiğiniz gibi kolayca revize edebildiğini düşündüm. – RobertFrank

1

Eh Oluşturduğum ettik böylece zaten fonksiyonları inşa arayan yorulmuştu benimkinin:

function RemoveNumbers(const AValue: string): string; 
    var 
     iCar : Integer; 
     mBuffer : string; 
    begin 
     mBuffer := AValue; 

     for iCar := Length(mBuffer) downto 1 do 
     begin 
     if (mBuffer[iCar] in ['0'..'9']) then 
      Delete(mBuffer,iCar,1); 
     end; 
     Result := mBuffer; 
    end; 
+4

İşleviniz başarısız olur, döngü sayacı önbelleğe alınır ve * kısalırsınız * dizginizdeki döngü. –

+2

Ancak bu sorunu silme sırasını geri alarak çözebilirsiniz (bunun yerine '...' yerine 'yerine). Sadece "string" deki karakterlerin "0" dan değil, 0'dan indekslendiğini unutmayın. –

+0

Tamam teşekkürler, kodumu düzenledim. – CharleyXIV

4

Oldukça hızlı inplace sürümü.

procedure RemoveDigits(var s: string); 
var 
    i, j: Integer; 
    pc: PChar; 
begin 
    j := 0; 
    pc := PChar(@s[1]); 
    for i := 0 to Length(s) - 1 do 
    if pc[i] in ['0'..'9'] then 
       //if CharInSet(pc[i], ['0'..'9']) for Unicode version 
     Inc(j) 
    else 
     pc[i - j] := pc[i]; 
    SetLength(s, Length(s) - j); 
end; 
+1

+1, orijinal dize büyükse, bu tür bir yöntem çok daha fazla bellek etkin demektir. herhangi bir str: = str +? veya geçici dize üreten başka bir yöntem, büyük veri kümelerinde (birkaç mega) basit dönüştürme yordamları (hex to bin, base64, vb) kullanıldığında karşılaştığım büyük bir bellek ayak izini çok hızlı bir şekilde biriktirebilir – Dampsquid

4

Bu, Nick'in sürümüyle aynı çıktıya sahiptir, ancak bu kısa dizelerle 3 kattan daha hızlıdır. Metin ne kadar uzun olursa, fark o kadar büyük olur.

function RemoveNumbers2(const aString: string): string; 
var 
    C:Char; Index:Integer; 
begin 
    Result := ''; 
    SetLength(Result, Length(aString)); 
    Index := 1; 
    for C in aString do 
    if not CharInSet(C, ['0' .. '9']) then 
    begin 
     Result[Index] := C; 
     Inc(Index); 
    end; 
    SetLength(Result, Index-1); 
end; 

Gerekmiyorsa, değerli CPU döngülerini boşa harcamayın.

0

kullanımı bu

function RemoveNonAlpha(srcStr : string) : string; 
const 
CHARS = ['0'..'9']; 
var i : integer; 
begin 
result:=''; 
for i:=0 to length(srcStr) do 
if (srcstr[i] in CHARS) then 
result:=result+srcStr[i]; 
end ; 

bu

edit2.text gibi diyebilirsiniz: = RemoveNonAlpha (edit1.text);

İlgili konular