2012-05-31 16 views
7

Chciałbym wiedzieć, jak mogę usunąć numery z ciągu. Próbuję użyć StringReplace i nie wiem jak powiedzieć funkcję, którą chcę zastąpić liczbami.Usuwanie liczb z ciągu

Oto, co starałem:

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

Cóż, Delphi XE i nowsze obsługują regularne wyrażenie, które może być użyte do zamiany ciągów znaków. Jest w RegularExpressions i RegularExpressionsCore units – Hendra

+0

OK, dziękuję, przyjrzę się temu. – CharleyXIV

Odpowiedz

11

Proste, ale skuteczne. Może być zoptymalizowany, ale powinien dać Ci to, czego potrzebujesz na początek:

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

To musi być najprostszy sposób, aby to zrobić, i najkrótszy kod. –

+0

Uzgodnione. Chociaż jestem wielkim fanem wyrażeń regularnych, rozwiązanie Nicka w tym konkretnym problemie jest znacznie szybsze. Coś bardziej skomplikowanego i pójdę z RegEx w mgnieniu oka! –

-1

StringReplace nie akceptuje ustawiony jako drugi argument. Może ktoś będzie miał bardziej odpowiednie podejście, ale to działa:

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

itp

+4

Fuj! Czy możesz powiedzieć "SUCHĄ" (nie powtarzaj się)? Przepraszam, ale muszę to potraktować jako * przerażające * rozwiązanie zadawanego pytania. –

+0

Zgadzam się .. można przynajmniej pętli .. dla i: = 0 do 9 zrobić StringReplace (mString, I, '', [rfReplaceAll, rfIgnoreCase]); –

+0

Hej, Ken, idź na mnie! :-) "Przerażający?" Tak, pętla for ma swoje zalety. Ale czasami dodanie złożoności powoduje błędy. Kod Johna (chyba że edytuje go po tym, jak to opublikowałem) jest dobrym przykładem: po pierwsze, nie kompiluje się. Zakładając, że "i" ma być liczbą całkowitą, właściwy kod jest nieco trudny. Drugi parametr powinien być chr (ord ("0") + i), nie? Lub pętla for powinna być dla ch: = chr ("0") do chr ("9"). Oba dodają trochę złożoności i tak naprawdę nie odpowiadają bezpośrednio na jego pytanie, w jaki sposób korzystać z StringReplace. Uznałem, że OP może z łatwością zmienić kod, jak sugerujesz. – RobertFrank

1

Dobrze byłem zmęczony szuka już budować funkcje więc już tworzyć własne:

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

Twoja funkcja się nie powiedzie, licznik pętli for jest buforowany, a Ty * skracasz * Twój ciąg w pętli. –

+2

Ale możesz rozwiązać ten problem, przywracając kolejność usuwania (zamiast tego użyj 'dla ... downto'). Pamiętaj tylko, że znaki w 'ciągu' są indeksowane z' 1', a nie z '0'. –

+0

Okej, dzięki, edytowałem mój kod. – CharleyXIV

4

Dość szybka wersja lokalna.

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 dla podstawienia w miejscu, jeśli oryginalny ciąg był duży, ten typ metody jest o wiele bardziej wydajny pod względem pamięci. any str: = str +? lub inny sposób, który generuje tymczasowy ciąg, może bardzo szybko narazić na duży ślad pamięci, z którym się zetknąłem, gdy proste procedury konwersji (hex do bin, base64, itp.) są używane na dużych zbiorach danych (kilka meg) – Dampsquid

4

Ma to samo wyjście co wersja Nicka, ale jest to ponad 3-krotnie szybsze z krótkimi łańcuchami. Im dłuższy tekst, tym większa różnica.

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; 

Nie marnuj cennych cykli procesora, jeśli nie musisz.

0

użycie tego

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 ; 

można nazwać jak ten

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

Powiązane problemy