freepascal - 为子字符串的多个实例遍历字符串 - freepascal 或 delphi

标签 freepascal lazarus

平台:Lazarus 1.1、FreePascal 2.7.1、Win 7 32 位。

我有一个字符串值如下:

FileName[12345][45678][6789].jpg

默认情况下(假设这是默认行为 0),我的程序当前从最后一对方括号中取出最后一组数字到文件名的最右侧,即 6789。它使用以下代码执行此操作:
if chkbxOverrideUniqueID.Checked then
   IDOverrideValue := StrToInt(edtToggleValue.Text);   
// User is happy to find the right most unique ID
if not chkbxOverrideUniqueID.Checked then      
  LastSquareBracket := RPos(']', strFileName);
  PreceedingSquareBracket := RPosEx('[', strFileName, LastSquareBracket) + 1;
  strFileID := AnsiMidStr(strFileName, PreceedingSquareBracket, LastSquareBracket - PreceedingSquareBracket)
else // User doesn't want to find the rightmost ID. 
  // and now I am stuck! 

但是,我现在为用户添加了一个选项来指定非默认行为。例如,如果他们输入“1”,则表示“从最右边的 ID 中查找第一个 ID”。例如[45678],因为 [6789] 是默认行为 0,请记住。如果他们输入 2,我希望它找到 [12345]。

我的问题:我该如何调整上面的代码来实现这一点?

最佳答案

以下代码将仅返回括号之间的数值:

uses
  StrUtils;

function GetNumber(const Text: string; Index: Integer): string;
var
  I: Integer;
  OpenPos: Integer;
  ClosePos: Integer;
begin
  Result := '';
  ClosePos := Length(Text) + 1;
  for I := 0 to Index do
  begin
    ClosePos := RPosEx(']', Text, ClosePos - 1);
    if ClosePos = 0 then
      Exit;
  end;
  OpenPos := RPosEx('[', Text, ClosePos - 1);
  if OpenPos <> 0 then
    Result := Copy(Text, OpenPos + 1, ClosePos - OpenPos - 1);
end;

如果您想要包含这些括号的值,请将最后一行替换为:
Result := Copy(Text, OpenPos, ClosePos - OpenPos + 1);

关于freepascal - 为子字符串的多个实例遍历字符串 - freepascal 或 delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829173/

相关文章:

g++ - Freepascal是否真的比gcc使用*少*的内存

delphi - Indy 10 TCP Client Server - 测试开放通信 channel

debugging - 防止 Lazarus 调试器分支到库单元

sqlite - Lazarus 中的 TSQLite3Connection 无法读取 sqlite 文件

delphi - 将 FPC .o 文件链接到 Delphi

delphi - 在非 GUI 环境 (DLL) 中使用事件监听器 (Delphi)

delphi - 如何设置枚举类型的值?

delphi - 更改 TAchart 系列的背景颜色

pascal - 尝试理解 Wirth 的 Pascal pl/0 编译器代码

freepascal - Free Pascal 有实现 SHA256 或 SHA512 的方法吗?