Как я могу получить адрес электронной почты из строки пар ключ = значение? - PullRequest
5 голосов
/ 30 октября 2009

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

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

Я хочу данные после электронной почты = но до live.com .?

Ответы [ 6 ]

11 голосов
/ 30 октября 2009

Есть несколько способов сделать это. Вы можете разделить строку на символ пробела, а затем передать ее в 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'];
2 голосов
/ 30 октября 2009

Моя идея:

  1. заменить пробелы на CRLF (если они разделены пробелами)
  2. загрузить в TStringList
  3. использовать свойство values ​​с именем 'email'
1 голос
/ 01 ноября 2009

при условии, что строка содержится в переменной 's', а 'tmp' является другой строковой переменной,

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

'tmp' будет содержать адрес

1 голос
/ 31 октября 2009

Еще одна идея, вы также можете использовать 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=');

Конечно, это будет работать только в том случае, если исходная строка всегда форматируется одинаково, было бы удобно для извлечения других данных при необходимости.

1 голос
/ 30 октября 2009

Следующий код работает, только если значения не содержат пробелов:

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;
0 голосов
/ 30 октября 2009

Разделите строку на массив строк, используя '=' в качестве разделителя, и вы получите массив в следующем порядке: «Ключ», затем «Значение», после чего вы можете просмотреть цикл поиска электронной почты затем просто добавьте 1 к индексу массива, чтобы получить значение. Но это может произойти по-разному (например, некоторые вводят '=' как символ), или в поле значения есть пустые строки

...