5

必要な文字列の一部を取得するにはどうすればよいですか?

accountid=xxxxxx type=prem servertime=1256876305 addtime=1185548735 validuntil=1265012019 username=noob directstart=1 protectfiles=0 rsantihack=1 plustrafficmode=1 mirrors= jsconfig=1 email=noob@live.com ロット=0 fpoints=6076 ppoints= 149 curfiles=38 curspace=3100655714 bodkb=60000000 premkbleft=25000000 ppointrate=116

email= の後に live.com.? までのデータが必要です。

4

6 に答える 6

11

これを行うにはいくつかの方法があります。スペース文字で文字列を分割し、それを TStringList に入れることができます。その後、TStringList の Value[String] プロパティを使用して、指定された名前の値を取得できます。

これを行うには、すべてのスペースをカンマで文字列置換します。

newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);

次に、結果を TStringList にインポートします。

var
  MyStringList : TStringList;
begin
  MyStringList := TStringList.Create;
  try
    MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
    Result := MyStringList.Values['email'];
  finally
    MyStringList.Free;
  end;
end;

これにより、メールの値が得られます。次に、"@" 記号で文字列を分割する必要がありますが、これは比較的簡単な作業です。もちろん、これはスペースが本当にフィールド間の区切り文字である場合にのみ機能します。

または、正規表現を使用することもできますが、Delphi はそれらをネイティブにサポートしていません (正規表現ライブラリが必要です -こちらを参照してください) 。

*** Smasher は (D2006+) Delimiter / Delimited text を次のように指摘しました:

MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
于 2009-10-30T10:58:06.533 に答える
2

私の考え:

  1. スペースを CRLF に置き換えます (スペースで区切られています)
  2. TStringList に読み込む
  3. 「メール」名で値プロパティを使用する
于 2009-10-30T10:54:14.387 に答える
1

文字列が変数「s」に保持され、「tmp」が別の文字列変数であると仮定すると、

i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
 begin
  tmp:= tmp + s[i]; 
  inc (i);
 end;

「tmp」はアドレスを保持します

于 2009-11-01T11:23:56.053 に答える
1

次のコードは、値にスペースが含まれていない場合にのみ機能します。

uses
  StrUtils, Classes;

....

function GetPropertyValue (const PropertyName : String; const InputString : String) : String;
var
  StringList : TStringList;
  Str : String;
begin
Result := '';
StringList := TStringList.Create;
try
  StringList.Delimiter := ' ';
  StringList.DelimitedText := InputString;
  for Str in StringList do
    if StartsText (PropertyName + '=', Str) then
      Result := RightStr (Str, Length (Str) - Length (PropertyName) - 1);    
finally
  FreeAndNil (StringList);
end;
end;
于 2009-10-30T10:48:09.387 に答える
1

別のアイデアとして、StringList テキストで PosEx (StrUtils) を使用することもできます。

function ExtractMyString(SrcStr, FromStr, ToStr: string): string;
var
  posBeg, posEnd: integer;
begin
  Result := '';
  posBeg := Pos(FromStr, SrcStr) + Length(FromStr);
  posEnd := PosEx(ToStr, SrcStr, posBeg);

  if (posBeg > 0) and (posEnd > posBeg) then
    Result := Copy(SrcStr, posBeg, posEnd-posBeg);
end;

使用法:

ExtractMyString(StringList.Text, 'email=', ' lots=');

もちろん、これはソース文字列が常に同じようにフォーマットされている場合にのみ機能し、必要に応じて他のデータを抽出するのに便利です。

于 2009-10-30T23:40:44.767 に答える
0

「=」を区切り記号として使用して文字列を文字列の配列に分割すると、「キー」、「値」の順に配列が作成され、「メール」キーを探してからループすることができます。値を取得するには、配列インデックスに 1 を追加します。しかし、これは多くの方法で失敗する可能性があります (たとえば、誰かが「=」を文字として入力した場合)、または値フィールドに空の文字列がある場合

于 2009-10-30T11:02:46.043 に答える