2012-12-11 76 views
4

平臺:Lazarus 1.1,FreePascal 2.7.1,Win 7 32位。遍歷子串的多個實例的字符串 - freepascal或delphi

我有一個字符串值,如下所示:

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]。

我的問題:請如何調整上述代碼以實現此目的?

+0

你有使用方括號還是你願意改變那部分? – jachguate

+0

rposex是FPC唯一順便說一句,雖然Synapse'synautil也包含它們 –

回答

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); 
+0

TLama ....太棒了!第一次工作。你很聰明!永恆的感謝。 –

+0

不客氣!忘了注意,這段代碼只能用一個輸入字符串正確地工作,其中每個左括號都有它的關閉對。 – TLama