web-dev-qa-db-ja.com

文字列内で最後に出現するcharを見つける

文字列内で最後に出現するcharの位置を特定するためのRTL Delphi関数はありますか?

29
DelphiNewbie

sysUtilsユニットの一部である LastDelimiter 関数を試してください。

27
RRUZ

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;
_
17

StrRScan または AnsiStrRScan の両方をSysUtils 単位。後者は、その名前にもかかわらず、stringUnicodeStringであるDelphiバージョンのUnicode文字で機能します。 (「実際の」Ansiバージョンが必要な場合は、AnsiStringsユニットを使用してください。)

これらの関数は正確に1文字を検索しますが、LastDelimiterは指定された可能性のリストからいくつかの文字のいずれかを検索します— StrRScanは1文字に最適化されたLastDelimiterと考えてくださいDelimiters引数。

11
Rob Kennedy

最良のクロスプラットフォームソリューションは TStringHelper.LastIndexOf であり、Delphi XE4以降に存在しています。

この関数は0ベースであることに注意してください。

3
vladon

そして、これが文字列内の部分文字列の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;
1
Sam