문제

필요한 문자열의 일부를 어떻게 얻을 수 있습니까?

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'];

다른 팁

내 생각:

  1. 공백을 CRLF로 교체하십시오 (공간 분리되어 있습니다)
  2. tstringlist에로드하십시오
  3. '이메일'이름으로 값 속성을 사용하십시오

다음 코드는 값이 공간이없는 경우에만 작동합니다.

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을 추가하여 값을 얻습니다. 그러나 이것은 많은 방법으로 실패 할 수 있습니다 (예 : 일부는 '='캐릭터로서 들어가십시오) 또는 값 필드에 빈 줄이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top