Delphi извлекает числа из строки - PullRequest
2 голосов
/ 11 января 2012

У меня есть множество строк, с которыми мне нужно работать, они содержат как буквы, так и цифры, я пытаюсь извлечь числа (это та часть, которая мне нужна) из строки, строки будут иметь формат, аналогичный-

кошка может сосчитать 123 567, как и собака "

Длина и положение чисел может варьироваться от 12 34 123 456 1234 5678 11111 11111

Такжеразделитель чисел может отличаться от знака вопроса, а также тире 12-34. 12.34. Таким образом, строка может быть, например, «кошка не может считать, собака может 12-67» или «кошка может считать 1234,5678, может и собака»Есть ли какой-нибудь умный способ в Delphi, чтобы я мог извлечь числа? Или я должен был бы сделать это путем сканирования строки в коде.

Любая помощь будет оценена

Спасибо

Colin

Ответы [ 3 ]

11 голосов
/ 11 января 2012

Если у вас Delphi XE или выше, вы можете использовать регулярные выражения.Это полностью не проверено, основываясь на ответе Дэвида Хеффернана:

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;
7 голосов
/ 11 января 2012

Я думаю, что эта функция - то, что вы ищете:

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;
3 голосов
/ 21 июля 2018
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 ;
...