key = valueのペアの文字列から電子メールアドレスを取得するにはどうすればよいですか?
-
22-07-2019 - |
質問
必要な文字列の一部を取得するにはどうすればよいですか
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'];
他のヒント
私の考え:
- スペースをCRLFに置き換えます(スペースで区切られています)
- TStringListにロード
- 「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を追加して値を取得します。しかし、これは多くの方法で失敗する可能性があります(たとえば、文字として「=」を入力する人がいる)、または値フィールドに空の文字列があります