Как я могу получить адрес электронной почты из строки пар ключ = значение?

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

Вопрос

Как я могу получить какую-то часть строки, которая мне нужна?

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'];

Другие советы

Моя идея:

  1. замените пробелы на CRLF (если они разделены пробелом).
  2. загрузить в TStringList
  3. используйте свойство 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 к индексу массива, чтобы получить значение. Но это может произойти по-разному (например, некоторые вводят '=' как символ), или в поле значения есть пустые строки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top