第一个问题是,我想去除字符串前面和后面的空格,但是中加的空格却不动。如 '    sdasda asdasd asda   '  我想输出'sdasda asdasd asda'这样的结果。应该如何实现??第二个问题是,请大家帮忙想个思路,如一个字符串名为: staffname  这是2个字母单词组成,我想建立一个字母库,就是存放入staff  name的单词,然后输入staffname 得到的结果是StaffName,就是匹配的单词首字母大写。  不知道大家有什么比较好的方法?pos('字母库',字符串),这样循环查找字母库的话,我怕要老半天才能搞定一个,如果批量的话,不知道要花多久时间了- -
而且还有个问题就是,知道如何区分比较短的字母,如Id,  westside,如何区分是成WestSide而不变成WestSIde;分数不多,请大家帮帮忙哈delphi字符串处理去除空格字母库

解决方案 »

  1.   

    第一个问题是,我想去除字符串前面和后面的空格,但是中加的空格却不动。如 '    sdasda asdasd asda   '  我想输出'sdasda asdasd asda'这样的结果。应该如何实现??var
      s: string;
    begin
      s := '    sdasda asdasd asda   ';
      s := Trim(s);
      ShowMessage(s);
    end;
      

  2.   

    原来trim不是去除所有空格,只是去除前后的空格啊,我以为去除所有的呢,受教了,谢谢。
      

  3.   


    procedure TForm1.Button6Click(Sender: TObject);
    var
      ini:TIniFile;
      i,j,k:Integer;
      a,s,d,z:string;
      str:TStringList;
    begin
      str:=TStringList.Create;
      ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
      for i:=0 to Memo4.Lines.Count-1 do
      begin
        k:=0;
        while Copy(Memo4.Lines[i],k,Length(Memo4.Lines[i]))<>'' do
        begin
          ShowMessage(IntToStr(Length(Copy(Memo4.Lines[i],k,Length(Memo4.Lines[i])))));
          a:=Memo4.Lines[i];
          s:=ini.ReadString(Copy(a,k,1),'s','');
          str.Clear;
          ExtractStrings([';'],[' '],PChar(s),str);
          for j:=0 to str.Count-1 do
          begin
            if Pos(str[j],a)>0 then
            begin
              d:=Copy(a,Pos(str[j],a),Length(str[j]));
              z:=UpperCase(Copy(d,0,1))+Copy(d,2,Length(d));
              Memo4.Lines[i]:=StringReplace(a,d,z,[rfReplaceAll]);
              k:=k+Length(d)+1;
              Break;
            end;
          end;
        end;        
      end;  
    end;
    目前能实现westside转换成WestSideini的配置如下
    [a]
    s=
    [b]
    s=
    [s]
    s=side;saa;see
    [w]
    s=west;wdd
    希望高手再帮忙简化下,感觉循环太多了,如果数量一大,就会运行缓慢。
      

  4.   

    procedure TForm1.Button6Click(Sender: TObject);
    var
      ini:TIniFile;
      i,j,k:Integer;
      a,s,d,z:string;
      str:TStringList;
      ifcontinue:Boolean;
    begin
      str:=TStringList.Create;
      ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
      for i:=0 to Memo4.Lines.Count-1 do
      begin
        k:=1;
        ifcontinue:=True;
        while Copy(Memo4.Lines[i],k,Length(Memo4.Lines[i]))<>'' do
        begin
          if ifcontinue=False then
            Break;
          a:=Memo4.Lines[i];
          s:=ini.ReadString(Copy(a,k,1),'s','');
          str.Clear;
          ExtractStrings([';'],[' '],PChar(s),str);
          if str.Count=0 then Break;
          for j:=0 to str.Count-1 do
          begin
            if Pos(str[j],a)>0 then
            begin
              d:=Copy(a,Pos(str[j],a),Length(str[j]));
              z:=UpperCase(Copy(d,0,1))+Copy(d,2,Length(d));
              Memo4.Lines[i]:=StringReplace(a,d,z,[rfReplaceAll]);
              k:=k+Length(d);
              Break;
            end;
            if j=str.Count-1 then
            begin
              Memo5.Lines.Add(a);
              ifcontinue:=False;
            end;
          end;
        end;        
      end;
    end;
    继续优化了下,把不认识的字母标记到Memo5里面,然后继续循环
    目前40个单词,感觉1秒就循环好了,速度还行,不过量多了,还是有点困难的样子,继续等待高手求优化
      

  5.   

    Trim()函数,即是去除两头的空格
      

  6.   

    本来英文应该是有空格分隔的,你这样改成没有空格的,也没有大小写,难度就和中文分词类似.
    如果仅仅凭借词库还是会有很多歧义的时候不好处理.例如:histroy怎么处理?是HisStroy还是Histroy呢.ahead是AHead还是Ahead呢?要准确区分岂不是要关联上下文
      

  7.   


    是啊,我现在就纠结这个问题,我目前只能说用一个优先级的方式,比如ahead
    如果用到ahead的话,就将ahead写前面,a写后面,这样的话,他会先循环检测ahead存在不,如不存在
    则再开始检测a这个方法主要是用于一些繁琐的代码,如数据库的字段大部分都连接在一起的,然后写代码的时候,确要根据编程规范,然后首字母大写。所以想出了这个方法来优化。
      

  8.   

    但是目前有这样的问题,如过首字母优先级高的,先在后面,优先级低的写在前面,就会导致,前面的单词无法转换。。比如 westward  如果ward优先级高于westward,则会被翻译成westWard
      

  9.   

    我说说一个较快的办法,前提是:你的字符串一定可分为若干个单词,即没有断的单词。
    伪代码:list := 单词表function Upper(s:string):string; //首字母大写
    begin
      //自己完成
    end;function InList(s:string):boolean; //看是否在表中
    begin
      result := true;
      for i := low(list) to high(list) do
        if list[i]=s then exit;
      result := false;
    end;function make(s:string):string;
    begin
      result := '';
      if s = '' then exit;
      for i := 1 to length(s) do
      begin
        tmp := copy(s,1,i);
        if InList(tmp) then
        begin
          tmp := Upper(tmp);
          tmp2 := make(copy(s,i+1, length(s)));
          if tmp2<>'' then
          begin
            result := tmp + tmp2;
            exit;
          end;
        end;
      end;
    end;参考中文最优分词算法,用了递归