Delphi中如何在无序字符串中获取时间子串的起始位置?
比如有字符串:[code=INIFile]ljdflaLKLS 1.22 上了打击法lsdjf2007-12-10 12:12:00 SDJowejSDK
SDLFJlsjfd sldjflkjLSDJ六十九上了打击法打开开发的东京07-12-10六十年代会计
上了多家来的家发SLJDdlk12:00:00ldkjflsd
jf2007-12-10 12:12:00:000sd上了打击法
是打开  是打开    2007/12/10 12:12:00sd [/code]
即字符串是任意的,时间子串出现的位置也是任意的。格式是系统可以识别的任意时间或日期格式,如:
第一行的:2007-12-10 12:12:00
第二行的:07-12-10
第三行的:2007-12-10 12:12:00:000
第四行的:2007/12/10 12:12:00
都可以认为是合法的时间子串,如何找到4个子串的起始位置和结束位置呢?那位高手能实现?最好能提供完整程序!

解决方案 »

  1.   

    to:wpf517
    小于10000年的都是正确的。
      

  2.   

    用正则表达式吧,要么Delphi自带的TMask对象也可以
      

  3.   

    function PickDatetime(sr:string):string;
    var
      s,s1:string;
      i:integer;
    begin
      result:='';
      for i:=1 to length(sr) do
      begin
        s:=copy(sr,i,4);
        if (StrToIntDef(s,0)>1900) then
        begin
          s1:=checkdate(sr,i);  //这是个函数,自己写吧
          if s1>' ' then
            result:=result+#13#10+s1;
          ////
          inc(i,8);    //这一句可能通不过,先去掉,以后再改用 while
        end;
      end;
    end;
      

  4.   

    我已经给你写好了,放在我的网络硬盘里面 RegExp.rar 
    地址:http://www.vdisk.cn/www/ 
    用户名:jackens
    密码:888888
      

  5.   

    关键代码如下  ReExpr.pas 可以在网上找到.
    uses RegExpr;
    .....
    procedure TForm1.Button1Click(Sender: TObject);
    var
      regEx: TRegExpr;
      matchstr:String;
    begin
      Memo2.Text:='';
      regEx:=TRegExpr.Create;
      regEx.Expression:='([\d]{4}\-[\d]{2}\-[\d]{2} [\d]{2}\:[\d]{2}\:[\d]{2})|([\d]{4}\/[\d]{2}\/[\d]{2} [\d]{2}\:[\d]{2}\:[\d]{2})|([\d]{4}\-[\d]{2}\-[\d]{2})|([\d]{4}\/[\d]{2}\/[\d]{2})|([\d]{2}\:[\d]{2}\:[\d]{2})';
      if regEx.Exec(Memo1.Text) then
      repeat
        matchstr:=regEx.Match[0];
        Memo2.Lines.Add(regEx.Match[0]);
      until not regEx.ExecNext;
    end;
      

  6.   

    非常感谢几位的帮助,特别是ideation_shang ,他已经实现了要求的功能。