2009-10-30 13 views
5

Jak mogę uzyskać część sznurka, której potrzebuję?Jak mogę uzyskać adres e-mail z ciągu par klucz = wartość?

accountid = typ xxxxxx = prem servertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 użytkownik = noobem directstart = 1 protectfiles = 0 rsantihack plustrafficmode = 1 = 1 lusterka = jsconfig = 1 [email protected] partie = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Chcę danych po e-mail = ale do live.com.?

+1

Dlaczego downvote? To jest poprawne pytanie IMHO. – jpfollenius

+0

tak, ale mógłbyś po prostu wyszukiwać e-maile, pomijać "=", zapętlać każdą z nich, aż trafisz na @ ... – Skuta

+0

Nie, ponieważ "e-maile" mogą pojawić się w dowolnym miejscu - w dawnej wartości, w środku nazwa nieruchomości ... – jpfollenius

Odpowiedz

11

Istnieje kilka sposobów, aby to zrobić. Możesz podzielić łańcuch na znak spacji, a następnie wprowadzić go do TStringList. Następnie możesz użyć właściwości Value [String] TStringList, aby uzyskać wartość danej nazwy.

Aby to zrobić, wykonaj ciąg zastąpić wszystkich pomieszczeniach przecinkami:

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

następnie zaimportować wynik w TStringList:

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

To daje wartość e-mail. Następnie musisz podzielić ciąg znaków na symbol "@", który jest stosunkowo trywialnym ćwiczeniem. Oczywiście działa to tylko wtedy, gdy spacje są rzeczywiście ogranicznikami między polami.

Alternatywnie można użyć wyrażenia regularnego, ale Delphi nie obsługuje tych natywnie (należałoby bibliotekę regex - patrz here)

*** Smasher zauważyć (D2006 +) Ogranicznik/tekst rozdzielany który wyglądałby coś takiego:

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

+ 1 Ładne rozwiązanie. Nie wiedziałem o właściwości 'Values'. Możesz zamiast tego używać przecinków "StringList.Delimiter' i" StringList.DelimitedText "zamiast zastępowania spacji. – jpfollenius

+3

Właściwość CommaText nie wymaga oddzielania przecinków od przecinków. Białe znaki będą działać równie dobrze, więc nie musisz konwertować spacji na przecinki. Lepiej jednak ustawić DelimitedText z ustawieniem StrictDelimiter na true. Wtedy możesz mieć przecinki w kluczach lub wartościach. –

1

Poniższy kod działa tylko wtedy, gdy wartości nie zawierają spacji:

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

Mój pomysł:

  1. zastąpić spacje z CRLF (to jest przestrzeń oddzielona)
  2. obciążenie do TStringList
  3. użyj wartości property z "e-mailem" nazwa
0

podzielić ciąg na tablicę ciąg, używając „=” jako deliminator, będziesz wtedy mieć tablicę ze w tej kolejności: „Klucz”, a następnie „wartość” mogłeś wtedy przeglądaj poszukiwanie klucza "e-mail", a następnie po prostu dodaj 1 do indeksu tablicy, aby uzyskać wartość. Ale może to zawieść na wiele sposobów (np. Niektóre wprowadzają znak "=") lub są puste ciągi znaków w polu wartości

1

Kolejny pomysł, możesz również użyć PosEx (StrUtils) z tekstem 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; 

Zastosowanie:

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

oczywiście to będzie działać tylko wtedy, gdy ciąg źródłowy jest zawsze sformatowane w taki sam sposób, byłby przydatny do wydobywania innych danych, ile potrzeba.

1

zakładając, że ciąg jest utrzymywany w zmiennej 's' i 'tmp' to kolejna zmienna ciąg

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

'tmp' odbędzie adres