Подтвердить что ты не робот

Найти последнее вхождение char в строке

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

4b9b3361

Ответ 1

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

Ответ 2

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;

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

И вот мой вклад в поиск позиции 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;