Найти последнее вхождение char в строку - PullRequest
26 голосов
/ 01 мая 2011

Существует ли какая-либо функция RTL Delphi для определения позиции последнего появления символа в строке?

Ответы [ 5 ]

27 голосов
/ 01 мая 2011

попробуйте функцию LastDelimiter, которая является частью блока SysUtils.

17 голосов
/ 01 мая 2011

RRUZ ответил на реальный вопрос (он дал вам функцию RTL).

Тем не менее, я не могу не дать простой фрагмент кода, который делает то, что вы хотите:

function LastCharPos(const S: string; const Chr: char): integer;
var
  i: Integer;
begin
  result := 0;
  for i := length(S) downto 1 do
    if S[i] = Chr then
      Exit(i);
end;

Поскольку это делает именно то, что вам нужно, и не предлагает никаких других функций, он гораздо более компактен (особенно когда мы используем синтаксис Exit(Result) в Delphi 2009 и более поздних версиях) и, возможно, немного быстрее. В Delphi 2007, однако, вы должны сделать

function LastCharPos(const S: string; const Chr: char): integer;
var
  i: Integer;
begin
  result := 0;
  for i := length(S) downto 1 do
    if S[i] = Chr then
    begin
      result := i;
      break; // or Exit; if you prefer that
    end;
end;
11 голосов
/ 01 мая 2011

Используйте StrRScan или AnsiStrRScan, оба в SysUtils . Последний, несмотря на свое название, работает с символами Unicode в версиях Delphi, где string равно UnicodeString. (Если вам все еще нужна «настоящая» версия Ansi, используйте модуль AnsiStrings .)

Эти функции ищут ровно один символ, тогда как LastDelimiter ищет любой из нескольких символов из заданного списка возможностей - представьте StrRScan как LastDelimiter, оптимизированный для аргумента Delimiters, состоящего из одного символа. *

3 голосов
/ 08 октября 2014

Лучшее кроссплатформенное решение - TStringHelper.LastIndexOf , оно существует с Delphi XE4.

Обратите внимание, что эта функция основана на 0.

1 голос
/ 18 декабря 2013

А вот мой вклад в нахождение позиции n-го вхождения подстроки в строке.

function GetPositionOfNthOccurence(sSubStr, sStr: string; iNth: integer): integer;
var
  sTempStr: string;
  iIteration: integer;
  iTempPos: integer;
  iTempResult: integer;
begin
  result := 0;

  // validate input parameters
  if ((iNth < 1) or (sSubStr = '') or (sStr = '')) then exit;

  // evaluate
  iIteration := 0;
  iTempResult := 0;
  sTempStr := sStr;
  while (iIteration < iNth) do
  begin
    iTempPos := Pos(sSubStr, sTempStr);
    if (iTempPos = 0) then exit;
    iTempResult := iTempResult + iTempPos;
    sTempStr := Copy(sStr, iTempResult + 1, Length(sStr) - iTempResult);
    inc(iIteration);
  end;
  result := iTempResult;
end;
...