Frage

Wie kann ich einen Teil von String bekommen, die ich brauche?

accountid = xxxxxx type = Prem Serverzeit = 1256876305 addtime = 1185548735 validUntil = 1265012019 username = Noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 Spiegel = jsconfig = 1 email=noob@live.com Lose = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Ich möchte Daten nach email = aber bis zu live.com.?

War es hilfreich?

Lösung

Es gibt ein paar Möglichkeiten, dies zu tun. Sie konnten die Zeichenfolge auf dem Leerzeichen geteilt dann in TStringList füttern. Sie können dann TStringList der Wert [Zeichenfolge] Eigenschaft, um den Wert eines bestimmten Namen zu erhalten.

Um das zu tun, ersetzt eine Zeichenfolge aller Räume mit Komma:

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

Dann das Ergebnis in eine TStringList importieren:

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

Dies wird Ihnen die E-Mail-Wert. Sie werden dann die Zeichenfolge am Symbol „@“ aufgespalten müssen, die eine relativ triviale Übung. Natürlich funktioniert dies nur, wenn Räume sind wirklich ein Trennzeichen zwischen den Feldern.

Alternativ können Sie einen regulären Ausdruck verwenden, aber Delphi nicht unterstützt diejenigen nativ (Sie eine regex Bibliothek benötigen würde - siehe hier )

*** Smasher festgestellt (D2006 +) Delimiter / Trennzeichen Text, der in etwa so aussehen:

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

Andere Tipps

Meine Idee:

  1. ersetzen Räume mit CRLF (es wird Leerzeichen getrennt)
  2. Last in TStringList
  3. verwenden, um Werte Eigenschaft mit 'E-Mail' name

Der folgende Code funktioniert nur, wenn Werte keine Leerzeichen enthalten:

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;

Eine andere Idee, könnten Sie auch POSEX (StrUtils) mit dem String Text verwendet werden:

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;

Verbrauch:

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

Natürlich wird dies nur funktionieren, wenn die Quellzeichenfolge immer die gleiche Weise formatiert ist, würde zum Extrahieren der anderen Daten nützlich sein, je nach Bedarf.

unter der Annahme, dass die Zeichenfolge in der Variablen 's' gehalten werden, und 'tmp' ist ein weiteres String-Variable,

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

'tmp' die Adresse hält

Teilen Sie die Zeichenfolge in ein Array von String, mit dem ‚=‘ als deliminator, werden Sie dann mit in dieser Reihenfolge ein Array haben: ‚Key‘ und dann ‚Value‘ Sie könnte dann die Schleife durch Suche nach der ‚E-Mail‘ Schlüssel dann fügen Sie einfach 1 zu dem Array-Index den Wert zu erhalten. Dies könnte sich aber in vielerlei Hinsicht scheitern (zB einige betritt ‚=‘ als Zeichen) oder es sind leere Strings im Wertefeld

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top