2009-10-30 36 views
5

Làm cách nào để nhận được một phần chuỗi mà tôi cần?Làm thế nào tôi có thể nhận được một địa chỉ email từ một chuỗi các cặp khóa = giá trị?

AccountID = loại xxxxxx = Prem servertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 username = Noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 gương = jsconfig = 1 [email protected] nhiều = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Tôi muốn dữ liệu sau email = nhưng lên đến live.com.?

+1

Tại sao downvote? Đây là một câu hỏi hợp lệ IMHO. – jpfollenius

+0

vâng, nhưng bạn có thể vừa tìm kiếm từ email, bỏ qua '=', lặp lại từng ký tự cho đến khi bạn nhấn vào ... – Skuta

+0

Không, vì 'email' có thể xảy ra ở bất kỳ đâu - bên trong giá trị cũ, bên trong tên thuộc tính ... – jpfollenius

Trả lời

11

Có một số cách để thực hiện việc này. Bạn có thể chia chuỗi trên ký tự khoảng trắng rồi đưa nó vào TStringList. Sau đó bạn có thể sử dụng thuộc tính Value [String] của TStringList để lấy giá trị của một tên đã cho.

Để làm điều đó, làm một chuỗi thay thế của tất cả các không gian bằng dấu phẩy:

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

Sau đó nhập kết quả vào một TStringList:

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

này sẽ cung cấp cho bạn giá trị email. Sau đó, bạn sẽ cần phải chia chuỗi tại ký hiệu "@", đó là một bài tập tương đối tầm thường. Tất nhiên, điều này chỉ hoạt động nếu không gian thực sự là một dấu phân cách giữa các trường.

Hoặc bạn có thể sử dụng một biểu thức chính quy nhưng Delphi không hỗ trợ những natively (bạn cần một thư viện regex - xem here)

*** đập bể lưu ý (D2006 +) Delimiter/văn bản Delimited mà sẽ trông một cái gì đó như thế này:

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

+1 Giải pháp hay. Không biết về thuộc tính 'Values'. Bạn chỉ có thể sử dụng 'StringList.Delimiter' và' StringList.DelimitedText' thay vì thay thế dấu cách bằng dấu phẩy. – jpfollenius

+3

Thuộc tính CommaText không yêu cầu các bản ghi được phân tách bằng dấu phẩy. Các ký tự khoảng trắng cũng sẽ hoạt động tốt, vì vậy bạn không cần phải chuyển đổi dấu cách thành dấu phẩy. Tuy nhiên, tốt hơn nên đặt DelimitedText với StrictDelimiter thành true. Sau đó, bạn được phép có dấu phẩy trong các khóa hoặc giá trị. –

1

Đoạn mã dưới đây chỉ hoạt động nếu giá trị không chứa dấu cách:

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

Ý tưởng của tôi:

  1. thay dấu cách bằng CRLF (nó nó được không gian tách)
  2. tải vào TStringList
  3. sử dụng giá trị bất động sản với tên 'email'
0

chia chuỗi thành một mảng các chuỗi, bằng cách sử dụng '=' như deliminator, bạn sẽ sau đó có một mảng với theo thứ tự này: 'Key' rồi 'Giá trị' bạn có thể sau đó lặp qua tìm kiếm khóa 'email', sau đó chỉ cần thêm 1 vào chỉ mục mảng để lấy giá trị. Nhưng điều này có thể thất bại theo nhiều cách (ví dụ: một số người nhập '=' làm ký tự) hoặc có chuỗi trống trong trường giá trị

1

Một ý tưởng khác, bạn cũng có thể sử dụng PosEx (StrUtils) với văn bản 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; 

cách sử dụng:

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

Tất nhiên điều này sẽ chỉ làm việc nếu chuỗi nguồn luôn được định dạng theo cùng một cách, sẽ được thuận tiện cho việc trích xuất các dữ liệu khác khi cần thiết.

1

giả định rằng chuỗi được tổ chức tại biến 's', và 'tmp' là một biến chuỗi,

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

'tmp' sẽ tổ chức địa chỉ

Các vấn đề liên quan