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.?

Foi útil?

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:

  1. Substitua os espaços pelo CRLF (é o espaço separado)
  2. Carregue na lista de TString
  3. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top