Como posso obter um endereço de e-mail de uma string de pares key = value?
-
22-07-2019 - |
Pergunta
Como posso obter alguma parte da string que preciso?
AccountId = xxxxxxx Tipo = prem servertime = 1256876305 addtime = 1185548735 Validuntil = 1265012019 nome de usuário = noob diretorstart = 1 Protectfiles = 0 rsantiHack = 1 plustrafficMode = 1 espelhos = JSCONFIGS = 1 email=noob@LOOB = 1 PlustrafficMo 149 abolagens = 38 Curspace = 3100655714 bodkb = 60000000 prekbleft = 25000000 ppointrato = 116
Eu quero dados após email = mas até Live.com.?
Solução
Há algumas maneiras de fazer isso. Você pode dividir a corda no caractere espacial e alimentá -la na lista de TString. Você pode usar a propriedade Value [String] da TStringList para obter o valor de um determinado nome.
Para fazer isso, faça uma string de substituição de todos os espaços por vírgulas:
newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Em seguida, importe o resultado para uma lista de TString:
var
MyStringList : TStringList;
begin
MyStringList := TStringList.Create;
try
MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Result := MyStringList.Values['email'];
finally
MyStringList.Free;
end;
end;
Isso lhe dará o valor de e -mail. Você precisará dividir a corda no símbolo "@", que é um exercício relativamente trivial. Obviamente, isso só funciona se os espaços são genuinamente um delimitador entre os campos.
Como alternativa, você pode usar uma expressão regular, mas Delphi não suporta isso nativamente (você precisaria de uma biblioteca Regex - veja aqui)
*** Smasher observou (D2006+) Delimiter / texto delimitado que se pareceria com isto:
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
Outras dicas
Minha ideia:
- Substitua os espaços pelo CRLF (é o espaço separado)
- Carregue na lista de TString
- Use a propriedade dos valores com o nome de 'email'
O código a seguir funciona apenas se os valores não contêm espaços:
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;
Outra idéia, você também pode usar Posex (Strutils) com o texto 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;
Uso:
ExtractMyString(StringList.Text, 'email=', ' lots=');
É claro que isso só funcionará se a sequência de origem for sempre formatada da mesma maneira, seria útil para extrair os outros dados, conforme necessário.
Supondo que a string seja mantida na variável 's' e 'tmp' é outra variável de string,
i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
begin
tmp:= tmp + s[i];
inc (i);
end;
'TMP' manterá o endereço
Divida a string em uma matriz de string, usando o '=' como o deliminador, você terá uma matriz nessa ordem: 'key' então 'value' que você poderá fazer a tecla 'email' e, em seguida, simplesmente simplesmente Adicione 1 ao índice da matriz para obter o valor. Mas isso pode falhar de várias maneiras (por exemplo, alguém entra '=' como personagem) ou há seqüências vazias no campo de valor