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


5

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

+2

Приятная пометка там;) 22 фев. 092009-02-22 09:24:20

8
uses JclStrings; 

    S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']); 
+2

Примечание: в последней библиотеке JCL вы бы сказали: 'использует JclAnsiStrings' 27 июн. 122012-06-27 12:57:44


1

OnKeyPress событие

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

  0

Вы должны проверить текст перед использованием в любом случае. Вы можете обойти эту проверку, используя буфер обмена или перетаскивание текста. 22 фев. 092009-02-22 10:23:11

  0

OP хочет стричь строку - никаких упоминаний о клавиатуре. 22 фев. 092009-02-22 11:42:00


3

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

Решение с использованием набора прекрасно работает в 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 в нескольких местах, и если это необходимо, чтобы быть изменилось, вам нужно изменить его только один раз.


10

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

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 для максимальной скорости (за счет меньшего readibility).

Edit: Re замечания 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; 

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

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

  0

Я считаю, что использование SrcPtr [0] здесь очень интересно - никогда раньше такого подхода не видел. Более каноническим способом было бы использовать SrcPtr^и DestPtr ^. 22 фев. 092009-02-22 11:26:38

  0

Re: Форматирование - возможно, если вы поместите недостающую точку с запятой после «DestPtr [0]: = 't», подсветка будет работать. :-) 22 фев. 092009-02-22 14:43:04

  0

Спасибо, Кен, исправлен, но он все еще не работает :-(Highlighter относится к слотам Delphi как к строкам C. К сожалению, 22 фев. 092009-02-22 15:56:44

  0

@mghie: RE Редактировать: Это действительно опрятный подход и то, о чем я никогда не думал. Идея! 22 фев. 092009-02-22 18:33:31

  0

Я думаю, вы хотите сказать 'while SrcPtr^<> # 0' или' while SrcPtr [0] <> # 0'. 27 июн. 122012-06-27 12:59:43

  0

Обратите внимание, что строки Delphi могут содержать нулевые символы. Результат вызова 'S: = ' Строка с нулевым символом '# 0' !, T: = StripNonAlphaNumeric (S); 'заканчивается символом' l'. 27 июн. 122012-06-27 13:02:48