Существует ли какая-либо функция RTL Delphi для определения положения последнего вхождения char в строке?
Найти последнее вхождение char в строке
Ответ 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;