2009-10-30 8 views
5

Wie bekomme ich einen Teil der Schnur, die ich brauche?Wie kann ich eine E-Mail-Adresse aus einer Kette von Schlüssel = Wert-Paaren erhalten?

accountid = xxxxxx type = prem Server = 1256876305 = 1185548735 AddTime validUntil = 1265012019 username = Noob directstart = 1 = 0 protectfiles rsantihack = 1 = 1 plustrafficmode Spiegeln = jsconfig = 1 [email protected] Lose = 0 fpoints = 6076 ppoints = 149 curfiles = 38 kursraum = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

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

+1

Warum downvote? Dies ist eine gültige Frage IMHO. – jpfollenius

+0

yeah, aber Sie könnten gerade nach E-Mail-Wort gesucht haben, überspringen Sie das '=', loop out jedes Zeichen, bis Sie das @ ... – Skuta

+0

Nein, weil 'E-Mail' überall auftreten kann - in einem ehemaligen Wert, in einem ehemaligen Name der Eigenschaft ... – jpfollenius

Antwort

11

Es gibt mehrere Möglichkeiten, dies zu tun. Sie könnten die Zeichenfolge auf das Leerzeichen aufteilen und dann in TStringList einspeisen. Sie können dann die TStringList-Eigenschaft Value [String] verwenden, um den Wert eines gegebenen Namens abzurufen.

, das zu tun, tun ersetzen 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 müssen dann die Zeichenfolge auf das "@" -Symbol aufteilen, was eine relativ triviale Übung ist. Dies funktioniert natürlich nur, wenn Leerzeichen tatsächlich ein Trennzeichen zwischen Feldern sind.

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 here)

*** Smasher festgestellt (D2006 +) Delimiter/Text mit Trennzeichen, die aussehen würde, so etwas wie diese:

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

+1 Schöne Lösung. Ich wusste nichts von der Eigenschaft "Werte". Sie könnten 'StringList.Delimiter' und' StringList.DelimitedText' verwenden, anstatt Leerzeichen durch Kommas zu ersetzen. – jpfollenius

+3

Die CommaText-Eigenschaft erfordert keine durch Kommas zu trennenden Datensätze. Whitespace-Zeichen funktionieren genauso gut, sodass Sie Leerzeichen nicht in Kommas konvertieren müssen. Es ist jedoch besser, DelimitedText mit StrictDelimiter auf true zu setzen. Dann dürfen Sie Kommas in den Schlüsseln oder Werten haben. –

1

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; 
2

Meine Idee:

  1. ersetzen Räume mit CRLF (es es Raum getrennt ist)
  2. Last in TStringList
  3. Werte verwenden Eigenschaft mit 'E-Mail' Name
0

Split 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‘ könnte man dann Durchlaufen Sie die Suche nach dem E-Mail-Schlüssel und fügen Sie dann einfach 1 zum Array-Index hinzu, um den Wert zu erhalten. Dies kann jedoch in vielerlei Hinsicht fehlschlagen (zB gibt jemand '=' als Zeichen ein) oder es gibt leere Zeichenfolgen im Wertfeld

1

Eine andere Idee, Sie könnten auch PosEx (StrUtils) mit dem StringList-Text verwenden:

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.

1

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' hält die Adresse

Verwandte Themen