2012-05-31 2 views
7

Я хотел бы знать, как я могу удалить числа из строки. Я пытаюсь использовать StringReplace, и я не знаю, как сообщить функции, которую я хочу заменить номерами.Удалить числа из строки

Вот что я пробовал:

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

Ну, Delphi XE и поддержка поддержки, которая может быть использована для замены строки. Он находится в элементах RegularExpressions и RegularExpressionsOore – Hendra

+0

Хорошо, спасибо, я посмотрю. – CharleyXIV

ответ

11

Простой, но эффективный. Может быть оптимизирован, но вы должны получить то, что вам нужно в начале:

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

Это должен быть самый простой способ сделать это и самый короткий код. –

+0

Согласовано. Хотя я БОЛЬШОЙ поклонник регулярных выражений, решение Ника этой конкретной проблемы намного быстрее. Все сложнее, и я бы с RegEx в одно мгновение! –

-1

StringReplace не принимает набор в качестве второго аргумента. Может быть, кто-то будет иметь более подходящий подход, но это работает:

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

т.д.

+4

Yuck! Можете ли вы сказать «СУХИЕ» (не повторяйте сами)? Извините, но я должен уменьшить это как * ужасное * решение вопроса. –

+0

Согласитесь .. вы могли бы хотя бы loop .. для i: = 0 to 9 do StringReplace (mString, I, '', [rfReplaceAll, rfIgnoreCase]); –

+0

Эй, Кен, успокойся! :-) «Ужасно?» Да, for-loop имеет преимущества. Но иногда добавление сложности добавляет ошибки. Код Джона (если он не редактирует его после того, как я опубликовал это), является хорошим примером: во-первых, он не компилируется. Предполагая, что он намеревается «i» быть целым числом, правильный код немного сложнее. Второй параметр должен быть chr (ord ('0') + i), no? Или for-loop должен быть для ch: = chr ('0') в chr ('9'). Оба добавляют немного сложности и на самом деле не отвечают на его вопрос напрямую, а именно, как использовать StringReplace. Я полагал, что OP может легко пересмотреть код, как вы предлагаете. – RobertFrank

1

Ну я устал искать уже строить функции, поэтому я создать свой собственный:

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

Ваша функция не работает, счетчик цикла цикла кэшируется, и вы * сокращаете * Ваша строка в цикле. –

+2

Но вы можете решить эту проблему, вернув порядок удаления (вместо этого используйте 'for ... downto'). Только помните, что символы в 'string' индексируются от' 1', а не от '0'. –

+0

Хорошо, я редактировал свой код. – CharleyXIV

4

Довольно быстрая версия на месте.

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 для замещения замещения, если исходная строка была большой, этот тип метода намного эффективнее с точки зрения памяти. любая str: = str +? или другой метод, который генерирует временную строку, может очень быстро наращивать большой объем памяти, с которым я сталкиваюсь, когда простые программы преобразования (hex to bin, base64 и т. д.) используются на больших наборах данных (несколько мегабайт) – Dampsquid

4

Это тот же результат, что и версия Ника, но это более чем в 3 раза быстрее с короткими строками. Чем дольше текст, тем больше разница.

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; 

Не тратьте драгоценные циклы процессора, если вам не нужно.

0

использование этого

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 ; 

вы можете назвать это как этот

edit2.text: = RemoveNonAlpha (Edit1.Text);

Смежные вопросы