Какой самый быстрый способ удаления не буквенно-цифровых символов из строки в Delphi7? - PullRequest
5 голосов
/ 22 февраля 2009

Допустимые символы: от A до Z, от a до z, от 0 до 9. Лучше всего использовать наименьшее количество кода или одну функцию, поскольку система реагирует на ввод времени с точки зрения времени.

Ответы [ 4 ]

10 голосов
/ 22 февраля 2009

Если я вас правильно понимаю, вы можете использовать такую ​​функцию:

function StripNonAlphaNumeric(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr <> #0 do begin
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin
      DestPtr[0] := SrcPtr[0];
      Inc(DestPtr);
    end;
    Inc(SrcPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

Это будет использовать PChar для максимальной скорости (за счет меньшей читаемости).

Редактировать: Повторный комментарий gabr об использовании DestPtr [0] вместо DestPtr ^ : в любом случае это должно компилироваться в одни и те же байты, но есть хорошие приложения в аналогичном коде, где вы должны смотреть в будущее. Предположим, вы захотите заменить символы новой строки, тогда вы можете сделать что-то вроде

function ReplaceNewlines(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr <> #0 do begin
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin
      DestPtr[0] := '\';
      DestPtr[1] := 't';
      Inc(SrcPtr);
      Inc(DestPtr);
    end else
      DestPtr[0] := SrcPtr[0];
    Inc(SrcPtr);
    Inc(DestPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

и поэтому я обычно не использую ^.

Кстати, у кого-нибудь есть идея, как отформатировать это так, чтобы подсветка работала правильно?

9 голосов
/ 09 июня 2009
uses JclStrings;

  S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
3 голосов
/ 22 февраля 2009

Просто чтобы добавить замечание.

Решение, использующее наборы, прекрасно в Delphi 7, но оно может вызвать некоторые проблемы в Delphi 2009, потому что наборы не могут быть char (они преобразуются в ansichar).

Решение, которое вы можете использовать:

case key of 
  'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action
else
  Key := #0;
end;

Но, конечно, самый универсальный способ:

if not ValidChar(key) then
  Key := #0;

В этом случае вы можете использовать ValidChar в нескольких местах, и если его нужно изменить, вам нужно изменить его только один раз.

1 голос
/ 22 февраля 2009

Событие OnKeypress

начать если нет (введите ['A' .. 'Z', 'a' .. 'z', '0' .. '9']), тогда Ключ: = # 0; конец;

...