Cách nhanh nhất để loại bỏ các ký tự không phải chữ và số từ một chuỗi trong Delphi7 là gì?


5

Các ký tự được phép là từ A đến Z, a đến z, 0 đến 9. Số tiền ít nhất của mã hoặc một hàm đơn lẻ sẽ là tốt nhất vì hệ thống là thời gian quan trọng khi phản hồi lại đầu vào.

+2

Gắn thẻ tốt ở đó;) 22 feb. 092009-02-22 09:24:20

8
uses JclStrings; 

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

Lưu ý: Trong thư viện JCL mới nhất, bạn sẽ nói: 'sử dụng JclAnsiStrings' 27 jun. 122012-06-27 12:57:44


1

kiện OnKeyPress

bắt đầu nếu không muốn nói (quan trọng trong [ 'A' .. 'Z', 'a' .. 'z', '0' .. '9']) sau đó chính: = # 0; kết thúc;

  0

Bạn phải xác thực văn bản trước khi sử dụng. Bạn có thể bỏ qua kiểm tra này bằng cách sử dụng tính năng kéo và thả tạm thời hoặc kéo thả văn bản. 22 feb. 092009-02-22 10:23:11

  0

OP muốn xóa một chuỗi - không đề cập đến bàn phím. 22 feb. 092009-02-22 11:42:00


3

Chỉ để thêm nhận xét.

Giải pháp sử dụng một bộ là tốt trong Delphi 7, nhưng nó có thể gây ra một số vấn đề trong Delphi 2009 vì bộ không thể có char (chúng được chuyển thành ansichar).

Một giải pháp bạn có thể sử dụng là:

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

Nhưng cách linh hoạt nhất là tất nhiên:

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

Trong trường hợp đó bạn có thể sử dụng ValidChar ở nhiều địa điểm và nếu nó cần phải được thay đổi bạn chỉ phải thay đổi nó một lần.


10

Nếu tôi hiểu bạn một cách chính xác bạn có thể sử dụng một chức năng như thế này:

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; 

này sẽ sử dụng PChar cho tốc độ cao nhất (với chi phí ít readibility).

Edit: Re bình luận bằng gabr về việc sử dụng DestPtr [0] thay vì DestPtr^: Điều này cần biên dịch để các byte cùng dù sao, nhưng có những ứng dụng thoải mái trong mã tương tự, khi bạn cần phải nhìn thẳng. Giả sử bạn muốn thay thế dòng mới, sau đó bạn có thể làm một cái gì đó như

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; 

và do đó tôi thường không sử dụng ^.

BTW, không ai có ý tưởng làm thế nào để định dạng này theo cách làm nổi bật hoạt động chính xác?

  0

Tôi thấy việc sử dụng SrcPtr [0] ở đây rất thú vị - chưa bao giờ thấy cách tiếp cận như vậy trước đây. Cách kinh điển hơn sẽ là sử dụng SrcPtr^và DestPtr ^. 22 feb. 092009-02-22 11:26:38

  0

Re: Định dạng - có thể nếu bạn đặt dấu chấm phẩy bị thiếu trong sau "DestPtr [0]: = 't'" đánh dấu sẽ hoạt động. :-) 22 feb. 092009-02-22 14:43:04

  0

Cảm ơn Ken, sửa chữa, nhưng nó vẫn không hoạt động :-(Các highlighter xử lý Delphi dây như C dây không may. 22 feb. 092009-02-22 15:56:44

  0

@mghie: RE Edit: Đó là cách tiếp cận thực sự gọn gàng và một cái gì đó mà tôi không bao giờ nghĩ đến. ý tưởng! 22 feb. 092009-02-22 18:33:31

  0

Tôi nghĩ bạn muốn nói 'trong khi SrcPtr^<> # 0' hoặc' trong khi SrcPtr [0] <> # 0'. 27 jun. 122012-06-27 12:59:43

  0

Lưu ý rằng chuỗi Delphi có thể chứa các ký tự null. Kết quả của việc gọi 'S: = ' Một chuỗi có ký tự '# 0' null '; T: = StripNonAlphaNumeric (S); 'sẽ kết thúc bằng' l'. 27 jun. 122012-06-27 13:02:48