Как я могу получить адрес электронной почты из строки пар ключ = значение?
-
22-07-2019 - |
Вопрос
Как я могу получить какую-то часть строки, которая мне нужна?
accountid=xxxxxx тип=prem servertime= 1256876305 addtime= 1185548735 validuntil= 1265012019 имя пользователя= новичок directstart=1 protectfiles= 0 rsantihack=1 plustrafficmode=1 зеркала = jsconfig=1 email=noob@live.com lots=0 fpoints= 6076 ppoints= 149 контрольных файлов = 38 curspace=3100655714 bodkb= 60000000 premkbleft= 25000000 ppointrate=116
Мне нужны данные после электронной почты =, но до live.com.?
Решение
Есть несколько способов сделать это. Вы можете разделить строку на символ пробела, а затем передать ее в TStringList. Затем вы можете использовать свойство Value [String] 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;
Это даст вам значение электронной почты. Затем вам нужно будет разделить строку в " @ " символ, который является относительно тривиальным упражнением. Конечно, это работает только в том случае, если пробелы действительно являются разделителем между полями.
В качестве альтернативы вы можете использовать регулярные выражения, но Delphi не поддерживает их изначально (вам понадобится библиотека регулярных выражений - см. здесь )
*** Smasher отметил (D2006 +) Текст разделителя / разделителя, который будет выглядеть примерно так:
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
Другие советы
Моя идея:
- замените пробелы на CRLF (если они разделены пробелом).
- загрузить в TStringList
- используйте свойство values с именем "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;
Другая идея, вы также могли бы использовать 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' будет содержать адрес
Разбейте строку на массив строк, используя '=' в качестве разделителя, после чего у вас будет массив в следующем порядке: «Ключ», затем «Значение», после чего вы можете просмотреть «электронную почту». затем просто добавьте 1 к индексу массива, чтобы получить значение. Но это может произойти по-разному (например, некоторые вводят '=' как символ), или в поле значения есть пустые строки