![](/img/trans.png)
[英]Lazarus: StringReplace ineffective when working with files (unicode issue)
[英]StringReplace not working as expected
这是该主题的新问题:
我来到以下代码:
procedure TForm1.BotaoLimpaClick(Sender: TObject);
var
ListaSubstituicoes, Atual: String;
ListaLimpeza, Pares: TStringList;
i: Integer; //('O' , ' .' , '.' , '/' , '-');
begin
ListaSubstituicoes := '|O| = |0| , | .| = |.| , . , / , -';
TextoCompleto := Trim(EditTexto.Text);
ListaLimpeza := TStringList.Create;
Pares := TStringList.Create;
ExtractStrings([','],[], PChar(ListaSubstituicoes), ListaLimpeza);
for i := 0 to (ListaLimpeza.Count - 1) do
begin
Atual := ListaLimpeza[i];
Atual := Trim(Atual);
if Pos('=', Atual) = 0 then
begin
TextoCompleto :=
StringReplace(TextoCompleto, Atual, '', [rfReplaceAll, rfIgnoreCase]);
Continue;
end;
Pares.Clear;
ExtractStrings(['='],[], PChar(Atual), Pares);
Pares.Text :=
StringReplace(Pares.Text, '|', '', [rfReplaceAll, rfIgnoreCase]);
//Pares[1] := StringReplace(Pares[1], '|', '', [rfReplaceAll, rfIgnoreCase]);
TextoCompleto :=
StringReplace(TextoCompleto, Pares[0], Pares[1], [rfReplaceAll, rfIgnoreCase]);
end;
这让我发疯了。 当我将其应用于以下内容时:
75691 .30698 02053447138 05764.100011 5 572500000382o0
它简单行不通! 它不会删除'.306'空格,并且不会在语句末尾用0替换o。 这是为什么? 我认为这与StringReplace无法正常运行有关,可能是它不尊重''空格,是否有任何线索?
Pares [0]正确获取'O'值,Pares [1]正确获取'0'。 我检查了一下。 但是奇怪的是, TextoCompleto := StringReplace(TextoCompleto, Pares[0], Pares[1], [rfReplaceAll, rfIgnoreCase]);
不产生替换的所期望的结果572500000382o0
与57250000038200
据我所知,我不确定期望的结果...
const
ListaSubstituicoes = 'O=0, .=.';
var
ListaLimpeza: TStringList;
i: Integer;
TextoCompleto:String;
begin
TextoCompleto := Trim(EditTexto.Text);
ListaLimpeza := TStringList.Create;
try
ExtractStrings([','],[], PChar(ListaSubstituicoes), ListaLimpeza);
for i := 0 to (ListaLimpeza.Count - 1) do
begin
TextoCompleto := StringReplace(TextoCompleto, ListaLimpeza.Names[i], ListaLimpeza.ValueFromIndex[i], [rfReplaceAll, rfIgnoreCase]);
end;
Caption := TextoCompleto; // test
finally
ListaLimpeza.Free;
end;
end;
指的是您的评论和链接,您可能正在寻找这样的内容,当然"
可以用例如|
代替"
|
const
ListaSubstituicoes = '"O"="0"," ."="."';
var
ListaLimpeza: TStringList;
i: Integer;
TextoCompleto:String;
begin
TextoCompleto := Trim(EditTexto.Text);
ListaLimpeza := TStringList.Create;
try
ExtractStrings([','],[], PChar(StringReplace(ListaSubstituicoes,'"','',[rfReplaceAll])), ListaLimpeza);
for i := 0 to (ListaLimpeza.Count - 1) do
begin
TextoCompleto := StringReplace(TextoCompleto, ListaLimpeza.Names[i], ListaLimpeza.ValueFromIndex[i], [rfReplaceAll, rfIgnoreCase]);
end;
Caption := TextoCompleto;
finally
ListaLimpeza.Free;
end;
end;
废话,使代码无法正常工作的唯一原因是缺少修剪。
StringReplace( -> Trim <- (Pares.Text), '|', '', [rfReplaceAll, rfIgnoreCase]);
但是我相信使用这样的Pares.Text
并不是很好的编码,因此我将其替换为:
ExtractStrings(['='],[], PChar(Atual), Pares);
Pares[0] := StringReplace(Trim(Pares[0]), '|', '', [rfReplaceAll, rfIgnoreCase]);
Pares[1] := StringReplace(Trim(Pares[1]), '|', '', [rfReplaceAll, rfIgnoreCase]);
奇迹般有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.