【问题标题】:Find the last occurrence of char in a string查找字符串中最后一次出现的 char
【发布时间】:2011-04-30 20:23:52
【问题描述】:

是否存在任何 RTL Delphi 函数来确定字符串中字符最后一次出现的位置?

【问题讨论】:

    标签: string delphi delphi-2007


    【解决方案1】:

    试试LastDelimiter 函数,它是 SysUtils 单元的一部分。

    【讨论】:

    • System.SysUtils.TStringHelper.LastIndexOf 当你想要一个字符串而不是一个字符时也可以很方便。
    【解决方案2】:

    RRUZ 回答了实际问题(他给了你一个 RTL 函数)。

    不过,我还是忍不住给出一个简单的代码 sn-p 来做你想做的事:

    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;
    

    【讨论】:

      【解决方案3】:

      SysUtils 单元中使用 StrRScanAnsiStrRScan。后者,尽管它的名字,在stringUnicodeString 的Delphi 版本中适用于Unicode 字符。 (如果您仍然需要“真正的”Ansi 版本,请使用 AnsiStrings 单元。)

      这些函数只搜索一个字符,而 LastDelimiter 从给定的可能性列表中搜索多个字符中的任何一个 - 将 StrRScan 视为针对单个字符 Delimiters 参数优化的 LastDelimiter

      【讨论】:

        【解决方案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;
          

          【讨论】:

          • 非常好,因为使用此代码也可以确定字符串中子字符串的出现次数。这解决了我现在的一个麻烦!感谢您的贡献。
          猜你喜欢
          • 1970-01-01
          • 2017-10-31
          • 2011-03-09
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 2016-01-08
          • 1970-01-01
          相关资源
          最近更新 更多