String Delphi从字符串中提取数字
我需要处理各种各样的字符串,这些字符串包含字母和数字,我试图从字符串中提取数字(这是我需要的部分),字符串的格式与- 猫能数一二三五六七,狗也能。” 数字的长度和位置可能因 12 34 123 456 1234 5678 111111111 此外,数字分隔符可以与空格问号和破折号不同 12-34 12.34 因此字符串可以是“猫不会数数,狗会12-67”或“猫会数数1234.5678,狗也会” 在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中有什么聪明的方法可以提取数字吗?或者我必须通过扫描代码中的字符串来实现 任何帮助都将不
科林我认为这个功能正是您想要的:
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年内rChar
和writes[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 ;