4

プラットフォーム: 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] を見つけてもらいたいです。

私の質問:これを達成するために上記のコードをどのように適応させますか?

4

1 に答える 1

6

次のコードは、括弧内の数値のみを返します。

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);
于 2012-12-11T22:17:35.133 に答える