2013-06-04 3 views
1

Это новый вопрос в тему:StringReplace не работает, как ожидалось

How do I store and load a list of key-value pairs in a string?

я пришел к следующему коду:

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 0,30698 02053447138 05764,100011 5 572500000382o0

это просто не работает! Он не удаляет пробел '.306' и не заменяет o 0 в конце инструкции. Почему это? Я считаю, что это связано с тем, что StringReplace работает неправильно, возможно, это не относится к «пробелам», каким-либо подсказкам?

Pares [0] правильно получает значение «O», а Pares [1] правильно получает «0». Я проверил со следами. Но странно, TextoCompleto := StringReplace(TextoCompleto, Pares[0], Pares[1], [rfReplaceAll, rfIgnoreCase]); не производит желаемого результата замены 572500000382o0 с 57250000038200

+2

Слишком много кода здесь. Отверните его до одного вызова 'StringReplace'. Используйте литералы для двух параметров строки. –

+0

Вы уже использовали отладчик? Вот как все остальные расследуют такие проблемы. Убедитесь, что вы передаете правильные значения функции, которую вы обвиняете в неправильном функционировании. Используйте окно просмотра и средство оценки выражения всплывающей подсказки. –

+0

Я сделал это. Именно так я пришел к выводу, что это проблема с StringReplace. –

ответ

2

я не уверен, желаемого результата, насколько я мог следовать ...

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; 
+0

bummi, я обновил OP со ссылкой, чтобы вы могли следить за ней. –

+0

Я пытаюсь это прямо сейчас, проблема в том, что, если у меня есть 'ListaSubstituicoes = '" O "=" 0 ",". "=". "';' Ie. пробелы в константе. –

+0

, чтобы удалить все пробелы, если хотите, вы можете использовать ListaSubstituicoes = '"O" = "0", "" = ""'; – bummi

0

Дерьмо, единственное, что делал код не работы является отсутствие отделки.

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]); 

работает как шарм.

+2

Позор, что вы не прислушались к моему совету. Это сделало бы вопрос простым и простым для вас. помогите, если вы не прислушаетесь к советам? –

+0

Человек, если вы хотите сказать что-то просто сказать, пожалуйста. Вы хотите, чтобы я приветствовал вас, что-то в этом роде? Что вы посоветовали так долго? –

+1

Комментарии к вопрос, который я добавил. Если бы вы сварили это до одной строки, это было бы Легко понять. –

Смежные вопросы