平台:Lazarus 1.1,FreePascal 2.7.1,Win 7 32位。
我有一个字符串值如下:
FileName[12345][45678][6789].jpg
默认情况下(假设这是默认行为0),我的程序当前将最后一对方括号中的最后一组数字拉出到文件名的最右边,即6789.它使用以下代码:< / p>
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]。
我的问题:我如何调整上述代码才能实现这一目标?
答案 0 :(得分: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);