第一个问题是,我想去除字符串前面和后面的空格,但是中加的空格却不动。如 ' sdasda asdasd asda ' 我想输出'sdasda asdasd asda'这样的结果。应该如何实现??第二个问题是,请大家帮忙想个思路,如一个字符串名为: staffname 这是2个字母单词组成,我想建立一个字母库,就是存放入staff name的单词,然后输入staffname 得到的结果是StaffName,就是匹配的单词首字母大写。 不知道大家有什么比较好的方法?pos('字母库',字符串),这样循环查找字母库的话,我怕要老半天才能搞定一个,如果批量的话,不知道要花多久时间了- -
而且还有个问题就是,知道如何区分比较短的字母,如Id, westside,如何区分是成WestSide而不变成WestSIde;分数不多,请大家帮帮忙哈delphi字符串处理去除空格字母库
而且还有个问题就是,知道如何区分比较短的字母,如Id, westside,如何区分是成WestSide而不变成WestSIde;分数不多,请大家帮帮忙哈delphi字符串处理去除空格字母库
s: string;
begin
s := ' sdasda asdasd asda ';
s := Trim(s);
ShowMessage(s);
end;
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
希望高手再帮忙简化下,感觉循环太多了,如果数量一大,就会运行缓慢。
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秒就循环好了,速度还行,不过量多了,还是有点困难的样子,继续等待高手求优化
如果仅仅凭借词库还是会有很多歧义的时候不好处理.例如:histroy怎么处理?是HisStroy还是Histroy呢.ahead是AHead还是Ahead呢?要准确区分岂不是要关联上下文
是啊,我现在就纠结这个问题,我目前只能说用一个优先级的方式,比如ahead
如果用到ahead的话,就将ahead写前面,a写后面,这样的话,他会先循环检测ahead存在不,如不存在
则再开始检测a这个方法主要是用于一些繁琐的代码,如数据库的字段大部分都连接在一起的,然后写代码的时候,确要根据编程规范,然后首字母大写。所以想出了这个方法来优化。
伪代码: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;参考中文最优分词算法,用了递归