key = valueのペアの文字列から電子メールアドレスを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1649071

質問

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

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 lots = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

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

役に立ちましたか?

解決

これを行うにはいくつかの方法があります。スペース文字で文字列を分割し、それを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'];

他のヒント

私の考え:

  1. スペースをCRLFに置き換えます(スペースで区切られています)
  2. TStringListにロード
  3. 「email」名の値プロパティを使用

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

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;

別のアイデアとして、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=');

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top