String Delphi从字符串中提取数字

String Delphi从字符串中提取数字,string,delphi,extract,String,Delphi,Extract,我需要处理各种各样的字符串,这些字符串包含字母和数字,我试图从字符串中提取数字(这是我需要的部分),字符串的格式与- 猫能数一二三五六七,狗也能。” 数字的长度和位置可能因 12 34 123 456 1234 5678 111111111 此外,数字分隔符可以与空格问号和破折号不同 12-34 12.34 因此字符串可以是“猫不会数数,狗会12-67”或“猫会数数1234.5678,狗也会” 在Delphi中有什么聪明的方法可以提取数字吗?或者我必须通过扫描代码中的字符串来实现 任何帮助都将不

我需要处理各种各样的字符串,这些字符串包含字母和数字,我试图从字符串中提取数字(这是我需要的部分),字符串的格式与-

猫能数一二三五六七,狗也能。”

数字的长度和位置可能因 12 34 123 456 1234 5678 111111111

此外,数字分隔符可以与空格问号和破折号不同 12-34 12.34 因此字符串可以是“猫不会数数,狗会12-67”或“猫会数数1234.5678,狗也会” 在Delphi中有什么聪明的方法可以提取数字吗?或者我必须通过扫描代码中的字符串来实现

任何帮助都将不胜感激

谢谢


科林

我认为这个功能正是您想要的:

function ExtractNumbers(const s: string): TArray<string>;
var
  i, ItemIndex: Integer;
  LastCharWasDigit: Boolean;
  len: Integer;
  Count: Integer;
  Start: Integer;
begin
  len := Length(s);
  if len=0 then begin
    Result := nil;
    exit;
  end;

  Count := 0;
  LastCharWasDigit := False;
  for i := 1 to len do begin
    if TCharacter.IsDigit(s[i]) then begin
      LastCharWasDigit := True;
    end else if LastCharWasDigit then begin
      inc(Count);
      LastCharWasDigit := False;
    end;
  end;
  if LastCharWasDigit then begin
    inc(Count);
  end;

  SetLength(Result, Count);
  ItemIndex := 0;
  Start := 0;
  for i := 1 to len do begin
    if TCharacter.IsDigit(s[i]) then begin
      if Start=0 then begin
        Start := i;
      end;
    end else begin
      if Start<>0 then begin
        Result[ItemIndex] := Copy(s, Start, i-Start);
        inc(ItemIndex);
        Start := 0;
      end;
    end;
  end;
  if Start<>0 then begin
    Result[ItemIndex] := Copy(s, Start, len);
  end;
end;
函数extractNumber(const s:string):TArray;
变量
i、 ItemIndex:整数;
LastCharWasDigit:布尔值;
len:整数;
计数:整数;
开始:整数;
开始
长度:=长度(s);
如果len=0,则开始
结果:=无;
出口
结束;
计数:=0;
LastCharWasDigit:=假;
对于i:=1到len do begin
如果TCharacter.IsDigit(s[i]),则开始
LastCharWasDigit:=真;
如果LastCharWasDigit,则结束else,然后开始
公司(计数);
LastCharWasDigit:=假;
结束;
结束;
如果LastCharWasDigit,则开始
公司(计数);
结束;
设置长度(结果、计数);
ItemIndex:=0;
开始:=0;
对于i:=1到len do begin
如果TCharacter.IsDigit(s[i]),则开始
如果Start=0,则开始
开始:=i;
结束;
结束,否则开始
如果开始,那么开始
结果[ItemIndex]:=复制(s,开始,i-Start);
公司(项目索引);
开始:=0;
结束;
结束;
结束;
如果开始,那么开始
结果[项目索引]:=副本(s,开始,len);
结束;
结束;

如果您有Delphi XE或更高版本,您可以使用正则表达式。根据David Heffernan的回答,这是完全未经测试的:

function ExtractNumbers(const s: string): TArray<string>;
var
    regex: TRegEx;
    match: TMatch;
    matches: TMatchCollection;
    i: Integer;
begin
    Result := nil;
    i := 0;
    regex := TRegEx.Create("\d+");
    matches := regex.Matches(s);
    if matches.Count > 0 then
    begin
        SetLength(Result, matches.Count);
        for match in matches do
        begin
            Result[i] := match.Value;
            Inc(i);
        end;
    end;
end;
函数extractNumber(const s:string):TArray;
变量
正则表达式:TRegEx;
比赛:TMatch;
匹配项:TMatchCollection;
i:整数;
开始
结果:=无;
i:=0;
regex:=TRegEx.Create(“\d+”);
匹配项:=正则表达式匹配项;
如果匹配。计数>0,则
开始
SetLength(结果、匹配项、计数);
为比赛做准备
开始
结果[i]:=match.Value;
公司(一);
结束;
结束;
结束;

RegExp如何?不是很聪明,但非常通用。注意:您的描述非常非正式,因此可能没有人会建议更好的方法。+1返回所有单个数字部分的好方法。不过,我不想添加对将
123.12
作为单个数字部分返回的支持,特别是在使用
a.123
时,
a..123
123.456
123.456
等都要考虑在内。:@Marjan而且总是有负数,但OP似乎把任何非数字都视为sep。@David谢谢,这是正确的job@SHINJaeGuk这发生在写答案后的7年内r
Char
和write
s[i].IsDigit
+1与我的版本相比,我更喜欢这个版本。也就是说,如果匹配。Count不编译。
function ExtractNumberInString ( sChaine: String ): String ;
var
    i: Integer ;
begin
    Result := '' ;
    for i := 1 to length( sChaine ) do
    begin
        if sChaine[ i ] in ['0'..'9'] then
        Result := Result + sChaine[ i ] ;
    end ;
end ;