2009-10-30 7 views
5

Come posso ottenere una parte della stringa di cui ho bisogno?Come posso ottenere un indirizzo e-mail da una stringa di coppie chiave = valore?

accountid = xxxxxx tipo = prem DB = 1.256.876,305 mila SommaTempi = 1.185.548,735 mila validuntil = 1265012019 username = niubbo directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 specchi = jsconfig = 1 [email protected] lotti = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Desidero dati dopo email = ma fino a live.com.?

+1

Perché downvote? Questa è una domanda valida IMHO. – jpfollenius

+0

sì, ma potresti aver appena cercato la parola email, saltare il '=', eliminare ogni carattere fino a quando non premi @ ... – Skuta

+0

No, perché 'email' può capitare ovunque - all'interno di un valore precedente, all'interno di un ex nome della proprietà ... – jpfollenius

risposta

11

Ci sono un paio di modi per farlo. È possibile dividere la stringa sul carattere dello 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 questo, fare una stringa sostituire di tutti gli spazi con le 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 vi darà il valore di posta elettronica. Dovrai quindi dividere la stringa con il simbolo "@", che è un esercizio relativamente banale. Naturalmente, questo funziona solo se gli spazi sono veramente un delimitatore tra i campi.

In alternativa si potrebbe usare un'espressione regolare, ma Delphi non supporta nativamente coloro (avreste bisogno di una libreria di espressioni regolari - vedi here)

*** Smasher notato (D2006 +) delimitatore/testo delimitato che apparirebbe qualcosa di simile:

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

+1 Bella soluzione. Non conoscevo la proprietà 'Values'. Si potrebbe semplicemente usare 'StringList.Delimiter' e' StringList.DelimitedText' invece di sostituire spazi con virgole. – jpfollenius

+3

La proprietà CommaText non richiede che i record siano separati da virgole. I caratteri spazi bianchi andranno altrettanto bene, quindi non è necessario convertire gli spazi in virgole. Meglio impostare DelimitedText con StrictDelimiter impostato su true, però. Quindi ti è permesso avere virgole nelle chiavi o nei valori. –

1

Il seguente codice funziona solo se i valori 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; 
2

mia idea:

  1. sostituire gli spazi con CRLF (esso è spazio)
  2. carico in TStringList
  3. utilizza la proprietà valori con il nome 'email'
0

dividere la stringa in un array di stringhe, utilizzando il '=' come il deliminator, si dovrà poi un array con in questo ordine: 'chiave' poi 'Valore' si potrebbe quindi ciclicamente cercando la chiave 'email', quindi aggiungi semplicemente 1 all'indice dell'array per ottenere il valore. Ma questo potrebbe fallire in molti modi (ad esempio qualcuno immette '=' come carattere) o ci sono stringhe vuote nel campo valore

1

Un'altra idea, si potrebbe 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; 

Usage:

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

Naturalmente questo funziona solo se la stringa di origine è sempre formattato allo stesso modo, sarebbe utile per estrarre gli altri dati, se necessario.

1

partendo dal presupposto che la stringa è tenuto in 's' variabile, e 'tmp' è un'altra variabile stringa,

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

'tmp' conterrà l'indirizzo

Problemi correlati