【问题标题】:How can I get an e-mail address out of a string of key=value pairs?如何从键=值对字符串中获取电子邮件地址?
【发布时间】:2009-10-30 10:40:31
【问题描述】:

我怎样才能得到我需要的部分字符串?

accountid=xxxxxx type=prem servertime=1256876305 addtime=1185548735 validuntil=1265012019 username=noob directstart=1 protectfiles=0 rsantihack=1 plustrafficmode=1 mirrors= jsconfig=1 email=noob@live.com lot= 0 fpoints=6076 ppoints=149 curfiles=38 curspace=3100655714 bodkb=60000000 premkbleft=25000000 ppointrate=116

我想要 email= 之后的数据,但要到 live.com。?

【问题讨论】:

  • 是的,但您可以只搜索电子邮件单词,跳过“=”,循环出每个字符,直到您点击 @...
  • 不,因为“电子邮件”可以出现在任何地方 - 在以前的值内,在以前的属性名称内...

标签: delphi delphi-2007 string-parsing


【解决方案1】:

有几种方法可以做到这一点。您可以在空格字符上拆分字符串,然后将其输入 TStringList。然后,您可以使用 TStringList 的 Value[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 本身不支持这些(您需要一个正则表达式库 - 请参阅 here

*** Smasher 指出 (D2006+) 分隔符/分隔文本,看起来像这样:

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

【讨论】:

  • +1 不错的解决方案。不知道Values 属性。您可以只使用StringList.DelimiterStringList.DelimitedText 而不是用逗号替换空格。
  • CommaText 属性不需要用逗号分隔记录。空白字符也可以,因此您无需将空格转换为逗号。不过,最好将 DelimitedText 设置为 StrictDelimiter 设置为 true。然后,您可以在键或值中使用逗号。
【解决方案2】:

我的想法:

  1. 用 CRLF 替换空格(它是空格分隔的)
  2. 加载到 TStringList 中
  3. 使用带有“电子邮件”名称的值属性

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案4】:

      另一个想法,您也可以将 PosEx (StrUtils) 与 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;
      

      用法:

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

      当然,这仅在源字符串始终以相同方式格式化时才有效,便于根据需要提取其他数据。

      【讨论】:

        【解决方案5】:

        假设字符串保存在变量's'中,而'tmp'是另一个字符串变量,

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

        'tmp' 将保存地址

        【讨论】:

          【解决方案6】:

          将字符串拆分为字符串数组,使用“=”作为分隔符,然后您将拥有一个数组,其顺序为:“Key”然后“Value”,然后您可以循环查找“email” key 然后只需将 1 添加到数组索引即可获取值。但这可能会在很多方面失败(例如,有人输入 '=' 作为字符)或者值字段中有空字符串

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-03
            • 2011-09-21
            • 1970-01-01
            • 2017-10-10
            • 2014-01-11
            • 1970-01-01
            • 2013-11-22
            • 1970-01-01
            相关资源
            最近更新 更多