文字列内で最後に出現するcharの位置を特定するためのRTL Delphi関数はありますか?
sysUtilsユニットの一部である LastDelimiter
関数を試してください。
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;
_
これはあなたが望んでいることを正確に実行し、他の機能を提供しないため、はるかにコンパクトであり(特に、Delphi 2009以降のExit(Result)
構文を使用する場合)、おそらくわずかに高速です。ただし、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;
_
StrRScan
または AnsiStrRScan
の両方をSysUtils 単位。後者は、その名前にもかかわらず、string
がUnicodeString
であるDelphiバージョンのUnicode文字で機能します。 (「実際の」Ansiバージョンが必要な場合は、AnsiStringsユニットを使用してください。)
これらの関数は正確に1文字を検索しますが、LastDelimiter
は指定された可能性のリストからいくつかの文字のいずれかを検索します— StrRScan
は1文字に最適化されたLastDelimiter
と考えてくださいDelimiters
引数。
最良のクロスプラットフォームソリューションは TStringHelper.LastIndexOf であり、Delphi XE4以降に存在しています。
この関数は0ベースであることに注意してください。
そして、これが文字列内の部分文字列の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;