如何删除所有文本只留下备忘录中的数字

时间:2014-12-08 06:31:37

标签: delphi

我需要一个通过相同行的按钮并查找字母,所以删除所有字母并只留下数字

示例:

fakestackoverflow;466546511
nulling;65496411

结果:

;466546511
;65496411

2 个答案:

答案 0 :(得分:3)

您尚未明确说明要保留哪些字符以及要省略哪些字符。但无论如何,最好编写一般函数来过滤基于调用者提供的标准进行过滤的字符。像这样:

function Filter(const Input: string; const Keep: TFunc<Char, Boolean>): string;
var
  C: Char;
  N: Integer;
begin
  SetLength(Result, Length(Input));
  N := 0;
  for C in Input do
    if Keep(C) then
    begin
      inc(N);
      Result[N] := C;
    end;
  SetLength(Result, N);
end;

我假设你正在使用传统的基于单一的字符串索引。

以下是如何调用该函数的演示:

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Character;

function Filter(const Input: string; const Keep: TFunc<Char, Boolean>): string;
var
  C: Char;
  N: Integer;
begin
  SetLength(Result, Length(Input));
  N := 0;
  for C in Input do
    if Keep(C) then
    begin
      inc(N);
      Result[N] := C;
    end;
  SetLength(Result, N);
end;

function IsNotLetter(C: Char): Boolean;
begin
  Result := not C.IsLetter;
end;

begin
  Writeln(Filter('fakestackoverflow;466546511', IsNotLetter));
  Writeln(Filter('nulling;65496411', IsNotLetter));
end.

<强>输出:

;466546511
;65496411

您希望将此类转换应用于备忘录控件的内容。这样做:

Memo1.Text := Filter(Memo1.Text, IsNotLetter);

答案 1 :(得分:-2)

我使用这个功能:

TYPE CharSet = SET OF CHAR;

FUNCTION KeepChars(CONST S : STRING ; CONST Z : CharSet) : STRING;
  VAR
    I   : Cardinal;

  BEGIN
    Result:='';
    FOR I:=1 TO LENGTH(S) DO IF S[I] IN Z THEN Result:=Result+S[I]
  END;

限制:仅用于保留8位字符。如果您希望它在Unicode中正常工作,您可以改为使用它:

FUNCTION KeepChars(CONST S,Keep : STRING) : STRING;
  VAR
    I   : Cardinal;

  BEGIN
    Result:='';
    FOR I:=1 TO LENGTH(S) DO IF POS(S[I],Keep)>0 THEN Result:=Result+S[I]
  END;

限制:不能正确处理多字16位字符。