delphi取某段字串中的資料

如果我有一段資料如下

<begin>

<field1>aa</field1>

<field2>bb</field2>

</begin>

程式要怎麼寫才能把aa和bb這兩個欄位值從中擷取出來呢?

感謝

2 個解答

評分
  • 是我
    Lv 5
    10 年前
    最佳解答

    使用 regular expression。

    2010-12-31 12:56:55 補充:

    這種樣式比對的問題,最好使用 regular expression (簡稱 regexp)來處理;但 Delphi 直至最近的 XE 版,才內建支援 regexp。因此,在 XE 版前若要使用 regexp,則需透過 Third Party 的軟體。不用 regexp 也可以,只是較為辛苦些、較沒彈性。以下是程式碼:

    function ExtractStr(s, b, e : string) : string;

    var

    i, j, k, l : integer;

    begin

    Result := '';

    if Length(s) - Length(b) - Length(e) <= 0 then

    exit;

    j := Length(s) - Length(e);

    for i := 1 to j do

    begin

    k := PosEx(b, s, i);

    if k > 0 then

    begin

    l := PosEx(e, s, k + Length(b));

    if l > 0 then

    begin

    Result := Copy(s, k + Length(b), l - Length(e));

    exit;

    end;

    end;

    end;

    end;

    函式 ExtractStr 擷取出 s 中,位於字串 b, e 之間的東東,例如:

    const

    fb1 = '<field1>';

    fb2 = '<field2>';

    fe1 = '</field1>';

    fe2 = '</field2>';

     :

     :

    // r = ''

    r := ExtractStr('<begin>', fb1, fe1);

    // s = 'aa'

    s := ExtractStr('<field1>aa</field1>', fb1, fe1);

    // t = 'bb'

    t := ExtractStr('<field2>bb</field2>', fb2, fe2);

    PosEx 函式在 Delphi 7 後才有 (StrUtils 中),若您的版本無此函數,以下是它的程式碼:

    // PosEx 函式取自 Delphi 7 的 StrUtils.pas

    function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

    var

    I,X: Integer;

    Len, LenSubStr: Integer;

    begin

    if Offset = 1 then

    Result := Pos(SubStr, S)

    else

    begin

    I := Offset;

    LenSubStr := Length(SubStr);

    Len := Length(S) - LenSubStr + 1;

    while I <= Len do

    begin

    if S[I] = SubStr[1] then

    begin

    X := 1;

    while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do

    Inc(X);

    if (X = LenSubStr) then

    begin

    Result := I;

    exit;

    end;

    end;

    Inc(I);

    end;

    Result := 0;

    end;

    end;

  • 5 年前

    請使用 delphi 的 xml data binding wizard 才是正解。

還有問題?馬上發問,尋求解答。