如何从键=值对字符串中获取电子邮件地址?
-
22-07-2019 - |
题
如何获得我需要的字符串的某些部分?
accountid=xxxxxx 类型=prem servertime=1256876305 addtime=1185548735 validuntil=1265012019 用户名=noob directstart=1 Protectfiles=0 rsantihack=1 plustrafficmode=1 镜像= jsconfig=1 email=noob@live.com 很多=0 fpoints=6076 ppoints= 149 curfiles=38 curspace=3100655714 bodkb=60000000 premkbleft=25000000 ppointrate=116
我想要 email= 之后的数据,但直到 live.com。?
解决方案
有几个方法可以做到这一点。你可以在空格字符分割字符串然后将其送入TStringList中。然后,您可以使用TStringList中的价值[字符串]属性来获取给定的名称的值。
要做到这一点,做一个字符串替换用逗号所有的空格组成:
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;
这会给你的电子邮件值。然后,您需要将字符串的“@”符号这是一个相对简单的工作分开。当然,这仅适用如果空间是真正的场之间的分隔符。
另外,您可以使用正则表达式,但德尔福不支持那些本身(你需要一个正则表达式库 - 看的此处)
***粉碎机注意到(D2006 +)定界符/分隔文本这将看起来像这样:
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
其他提示
我的想法:
- 用 CRLF 替换空格(它是空格分隔的)
- 加载到 TStringList
- 使用带有“电子邮件”名称的值属性
下面的代码只能如果值包含空格:
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;
另一个想法,你也可以使用PosEx(StrUtils)与文本StringList的:
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' 将保存地址
在这个顺序与分割字符串转换为字符串数组,使用“=”作为deliminator,您将有一个数组:“键”,那么“价值”然后你可以遍历寻找“电子邮件”键,然后只需添加1到数组索引来获取值。但是这可能在很多方面失败(例如,一些一个进入“=”作为一个字符),或有在值字段空字符串