Key = value 쌍의 문자열에서 이메일 주소를 어떻게 얻을 수 있습니까?
-
22-07-2019 - |
문제
필요한 문자열의 일부를 어떻게 얻을 수 있습니까?
AccountID = XXXXXX 유형 = 프리 세버 타임 = 1256876305 ADDTIME = 1185548735 VALIDITIL = 1265012019 사용자 이름 = noob DirectStart = 1 ProtectFiles = 0 rsantihack = 1 PlustrafficMode = 1 Mirrors = jsconfig = 1 email=noob@live.com = 6076 PPOINTS = 0 FPOINTS = 6076 PPOINTS = 6076 149 CURFILES = 38 CURSPACE = 3100655714 BODKB = 60000000 PREMKBLEFT = 25000000 PPOONTRATE = 116
이메일 이후에 데이터를 원하지만 live.com까지 올라갑니다.?
해결책
이 작업을 수행하는 몇 가지 방법이 있습니다. 공간 문자의 문자열을 분할 한 다음 tstringlist로 공급할 수 있습니다. 그런 다음 tstringList의 값 [String] 속성을 사용하여 주어진 이름의 값을 얻을 수 있습니다.
그렇게하려면 모든 공간을 쉼표로 교체하십시오.
newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
그런 다음 결과를 tstringlist로 가져옵니다.
var
MyStringList : TStringList;
begin
MyStringList := TStringList.Create;
try
MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Result := MyStringList.Values['email'];
finally
MyStringList.Free;
end;
end;
이것은 당신에게 이메일 값을 줄 것입니다. 그런 다음 비교적 사소한 운동 인 "@"기호로 문자열을 분할해야합니다. 물론 이것은 공간이 진정으로 필드 사이의 구분 기인 경우에만 작동합니다.
또는 정규 표현식을 사용할 수 있지만 Delphi는 기본적으로 지원하지 않습니다 (Regex 라이브러리가 필요합니다. 여기)
*** Smasher는 (D2006+) Delimiter / Delimited Text가 다음과 같이 보일 것입니다.
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
다른 팁
내 생각:
- 공백을 CRLF로 교체하십시오 (공간 분리되어 있습니다)
- tstringlist에로드하십시오
- '이메일'이름으로 값 속성을 사용하십시오
다음 코드는 값이 공간이없는 경우에만 작동합니다.
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;
또 다른 아이디어는 StringList 텍스트와 함께 Posex (Strutils)를 사용할 수도 있습니다.
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;
용법:
ExtractMyString(StringList.Text, 'email=', ' lots=');
물론 이것은 소스 문자열이 항상 같은 방식으로 형식화되어있는 경우에만 작동하며 필요에 따라 다른 데이터를 추출하는 데 유용합니다.
문자열이 변수 's'로 유지되고 'tmp'가 다른 문자열 변수라고 가정하면
i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
begin
tmp:= tmp + s[i];
inc (i);
end;
'TMP'는 주소를 보유합니다
구분자로서 '='를 사용하여 문자열을 문자열 배열로 나누면이 순서로 배열이 있습니다. 배열 인덱스에 1을 추가하여 값을 얻습니다. 그러나 이것은 많은 방법으로 실패 할 수 있습니다 (예 : 일부는 '='캐릭터로서 들어가십시오) 또는 값 필드에 빈 줄이 있습니다.