2009-10-30 18 views
5

¿Cómo puedo obtener una parte de la cuerda que necesito?¿Cómo puedo obtener una dirección de correo electrónico de una cadena de pares clave = valor?

AccountId = tipo xxxxxx = Prem servertime = 1256876305 addTime = 1185548735 validuntil = 1265012019 Username = Noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 espejos = jsconfig = 1 [email protected] viviendas = 0 fpoints = 6076 = 149 ppoints curfiles = 38 = 3100655714 curspace bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Quiero datos después de correo electrónico = pero hasta live.com.?

+1

¿Por Downvote? Esta es una pregunta válida en mi humilde opinión. – jpfollenius

+0

sí, pero podría haber buscado una palabra de correo electrónico, omita el '=', buclee cada carácter hasta que toque @ ... – Skuta

+0

No, porque 'correo electrónico' puede ocurrir en cualquier lugar, dentro de un valor anterior, dentro de un antiguo nombre de la propiedad ... – jpfollenius

Respuesta

11

Hay un par de formas de hacerlo. Puede dividir la cadena en el carácter de espacio y luego alimentarlo en TStringList. Luego puede usar la propiedad Value [String] de TStringList para obtener el valor de un nombre dado.

Para hacer esto, use una cadena sustituir de todos los espacios con comas:

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

luego importar el resultado en un TStringList:

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

esto le dará el valor de correo electrónico. Luego deberá dividir la cadena en el símbolo "@", que es un ejercicio relativamente trivial. Por supuesto, esto solo funciona si los espacios son genuinamente un delimitador entre campos.

otra posibilidad es utilizar una expresión regular, pero Delphi no admite de forma nativa los (que había necesidad de una biblioteca de expresiones regulares - ver here)

*** Smasher señaló (D2006 +) Delimitador/texto delimitado por el cual se vería algo como esto:

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

+1 Buena solución. No sabía sobre la propiedad 'Values'. Simplemente podría usar 'StringList.Delimiter' y' StringList.DelimitedText' en lugar de reemplazar espacios con comas. – jpfollenius

+3

La propiedad CommaText no requiere que los registros estén separados por comas. Los personajes de espacios en blanco funcionarán igual de bien, por lo que no es necesario convertir espacios en comas. Sin embargo, es mejor establecer DelimitedText con StrictDelimiter establecido en verdadero. Entonces puedes tener comas en las claves o valores. –

1

El siguiente código sólo funciona si los valores no contienen espacios:

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

Mi idea:

  1. sustituir los espacios CRLF (que se separa el espacio)
  2. carga en TStringList
  3. use values ​​property con el nombre 'email'
0

dividir la cadena en una matriz de cadena, usando el '=' como el deliminator, a continuación, tendrá una matriz con en este orden: 'clave' y luego 'Valor' a continuación, podría recorra buscando la clave 'email' y simplemente agregue 1 al índice de la matriz para obtener el valor. Pero esto podría fallar de muchas maneras (por ejemplo, alguien ingresa '=' como un carácter) o hay cadenas vacías en el campo de valor

1

Otra idea, también podría usar PosEx (StrUtils) con el texto 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; 

Uso:

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

por supuesto, esto sólo funcionará si la cadena de origen siempre tiene el formato de la misma manera, sería muy útil para la extracción de los otros datos según sea necesario.

1

suponiendo que la cadena se lleva a cabo en la variable 's', y 'tmp' es otra variable de cadena,

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

'tmp' llevará a cabo la dirección de

Cuestiones relacionadas