Domanda

Come posso ottenere una parte della stringa di cui ho bisogno?

accountid = xxxxxx type = prem servertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 username = noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 mirror = jsconfig = 1 email=noob@live.com lot = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Voglio i dati dopo l'e-mail = ma fino a live.com.?

È stato utile?

Soluzione

Ci sono un paio di modi per farlo. È possibile dividere la stringa sul carattere spazio e quindi inserirla in TStringList. È quindi possibile utilizzare la proprietà Value [String] di TStringList per ottenere il valore di un determinato nome.

Per fare ciò, fai una sostituzione di stringa di tutti gli spazi con virgole:

newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);

Quindi importare il risultato in un TStringList:

var
  MyStringList : TStringList;
begin
  MyStringList := TStringList.Create;
  try
    MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
    Result := MyStringList.Values['email'];
  finally
    MyStringList.Free;
  end;
end;

Questo ti darà il valore dell'email. Dovrai quindi dividere la stringa in " @ " simbolo che è un esercizio relativamente banale. Ovviamente, questo funziona solo se gli spazi sono veramente delimitatori tra i campi.

In alternativa potresti usare un'espressione regolare ma Delphi non supporta quelli nativi (avresti bisogno di una libreria regex - vedi qui )

*** Smasher notato (D2006 +) Delimitatore / Testo delimitato che assomiglierebbe a questo:

MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];

Altri suggerimenti

La mia idea:

  1. sostituisce gli spazi con CRLF (è spazio separato)
  2. carica in TStringList
  3. usa la proprietà valori con il nome "email"

Il seguente codice funziona solo se i valori non contengono spazi:

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;

Un'altra idea, potresti anche usare PosEx (StrUtils) con il testo 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;

Utilizzo:

ExtractMyString(StringList.Text, 'email=', ' lots=');

Ovviamente funzionerà solo se la stringa di origine è sempre formattata nello stesso modo, sarebbe utile per estrarre gli altri dati quando necessario.

supponendo che la stringa sia mantenuta nella variabile 's' e 'tmp' sia un'altra variabile di stringa,

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

'tmp' conterrà l'indirizzo

Dividi la stringa in un array di stringhe, usando '=' come delimitatore, avrai quindi un array con in questo ordine: 'Key' quindi 'Value', quindi puoi scorrere cercando la 'email' quindi aggiungere semplicemente 1 all'indice dell'array per ottenere il valore. Ma questo potrebbe fallire in molti modi (es. Qualcuno inserisce '=' come carattere) o ci sono stringhe vuote nel campo valore

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top