输入一串汉字和字母的混合串,例如:‘在三角形ABC中’,我要得到‘在\三角形\ABC\中’。
写了几个函数,运行结果就是不对。
Function TSegmentForm.HHStrSever(StrTo:String):String;
var
  StrOut,Str:String;
  i,j:integer;
begin
  StrOut:='';
  while Length(StrTo)<>0 do
  begin
    i:=0;
    if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
    begin
      i:=1;
      while (i<Length(StrTo)) and ((StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z'])) do
        inc(i);
      StrOut:=StrOut+LeftBStr(StrTo,i)+'\';
      StrTo:=RightBStr(StrTo,Length(StrTo)-i);
    end
    else
    begin
      j:=0;
      while (j<Length(StrTo)) and not ((StrTo[j] in ['a'..'z']) or (StrTo[j] in ['A'..'Z'])) do   //&Egrave;&iexcl;&sup3;&ouml;&Aacute;&not;&ETH;&oslash;&micro;&Auml;&Ograve;&raquo;&acute;&reg;&ordm;&ordm;×&Ouml;
        j:=j+2;
      StrOut:=StrOut+HZStrSever(LeftBStr(StrTo,j));
      StrTo:=RightBStr(StrTo,Length(StrTo)-j);
    end;
  end;
  HHStrSever:=StrOut;
end;
Function TSegmentForm.HZStrSever(StrTo:String):String;
var
  StrOut,StrTmp:String;
  Len:Integer;
begin
  StrOut:='';
  while Length(StrTo)<>0 do
    begin
      Len:=Length(StrTo);
      if Len>16 then Len:=16;
      StrTmp:=LeftBStr(StrTo,Len);
      while (Len>2) and (not isFound(StrTmp)) do
        begin
          Len:=Len-2;
          StrTmp:=LeftBStr(StrTmp,Len);
        end;      StrOut:=StrOut+StrTmp+'\';
      StrTo:=RightBStr(StrTo,Length(StrTo)-Length(StrTmp));
    end;
  HZStrSever:=StrOut;
end;
Function TSegmentForm.isFound(StrTo:String):Boolean;
begin
  with Table1 do
  begin
    if Active then Close;
    Open;
    if Locate('WORDNAME',StrTo,[]) then isFound:=True
    else isFound:=False;
  end;
end;其中,后面两个函数HZStrSever和isFound我觉得没问题,就是第一个函数调用老得不到想要的结果。你帮帮我啦。

解决方案 »

  1.   

    我想将一个由汉字、大小写字母和其它一些特殊符号组成的字符串用某种分隔符(这里用了‘\’)分开,具体操作是这样的:
    1. 汉字。按照最大匹配法,先取预先设定长度的字符串,在数据表中查找该字符串,如果找到,就在该字符串的尾部加上分隔符;如没找到,就从该取出字符串的尾部减去两个字节,继续在数据表中找......(见HZStrSever函数)2.字母。取出连续的字母序列后在尾部加上分隔符。我讲清楚了吗?
      

  2.   

    to Dlwxn(流云) 
    \应该说是没有规律的吧。to GoldShield(小花☆正直人) 
    不是只针对我举的这个例子。谢谢大家了,帮帮我吧。分不够还可以再加。
      

  3.   

    晕,没有规律由:‘在三角形ABC中’,怎么得到‘在\三角形\ABC\中’?难道是随机的。
      

  4.   

    改写你的HHStrSever,你试一下:
    function TSegmentForm.HHStrSever(StrTo: String): String;
    var
      StrOut:String;
      i,j:integer;
    begin
      StrOut:='';
      while Length(StrTo)>0 do
      begin
        i:=1;
        if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
        begin
          i:=1;
          while (i<Length(StrTo)) and ((StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z'])) do
          begin
            if Ord(StrTo[i+1]) > 127 then Break;
            inc(i);
          end;
          StrOut:=StrOut+LeftBStr(StrTo,i)+'\';
          StrTo:=RightBStr(StrTo,Length(StrTo)-i);
        end
        else
        begin
          j:=0;
          while (j<Length(StrTo)) and not ((StrTo[j] in ['a'..'z']) or (StrTo[j] in ['A'..'Z'])) do   //&Egrave;&iexcl;&sup3;&ouml;&Aacute;&not;&ETH;&oslash;&micro;&Auml;&Ograve;&raquo;&acute;&reg;&ordm;&ordm;×&Ouml;
          begin
            if Ord(StrTo[j+1]) <= 127 then Break;
            j:=j+2;
          end;
          StrOut:=StrOut+HZStrSever(LeftBStr(StrTo,j));
          StrTo:=RightBStr(StrTo,Length(StrTo)-j);
        end;
      end;
      if StrOut[Length(StrOut)] = '\' then StrOut := LeftBStr(StrOut, Length(StrOut)-1);
      HHStrSever:=StrOut;
    end;
      

  5.   

    我是菜鸟,我用菜鸟的角度来看,发现以下问题
    1.HHStrSever函数里面的var Str:string在该函数中自始至终都没有使用过。
    2.在HHStrServer函数里面的条件语句
      if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
      else
      这个if..else的关系,是否存在着“不是A,就是B”的关系呢?如果存在“不是A,有可能是B,也有可能是C”的关系的话,那么我个人认为,这个条件语句就值得琢磨琢磨。
      

  6.   

    to  weizi2000(秋风啊-秋的叹息) 
    好像可以了,有几个问题请教:
    1.while Length(StrTo)<>0 do
      begin
        i:=0;
        if (StrTo[i] in ['a'..'z']) or (StrTo[i] in ['A'..'Z']) then
        begin......  你将i:=0改成i:=1原因是啥?2.你代码中if Ord(StrTo[i+1]) > 127 then Break;意思是如果后一个字节不是字母了,那么就跳出循环体;而if Ord(StrTo[j+1]) <= 127 then Break; 就是当后一个不是汉字的时候跳出?3. 这个127是啥意思?4.最后if StrOut[Length(StrOut)] = '\' then StrOut := LeftBStr(StrOut, Length(StrOut)-1);
      这里你设置的条件有可能发生吗?