2016-09-24 10 views
0

Этот код я использовал для изменения текста, поскольку мне нужно.Как предотвратить изменение текста между специальными символами

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    string A = textBox1.Text.Trim(); 

    A = A.Replace("A", "C"); 
    A = A.Replace("F", "H"); 
    A = A.Replace("C", "W"); 
    A = A.Replace("B", "G"); 

    textBox2.Text = (A); 
} 

Теперь мне нужно, чтобы остановить текст изменения после если я типа «|» символ в tetxbox1, снова мне нужно начать изменение текста, если я набираю '|' символ снова, например, произошедшее на этом изображении.

enter image description here

Так как я могу предотвратить изменение текста между этими двумя символами только ||

+1

Это должно быть довольно просто. что ты уже испробовал? – STLDeveloper

+0

Хе-хе: P я попробовал большинство кодов, и я также спросил вчера: http://stackoverflow.com/questions/39666067/how-can-i-ignore-replace-text-within-specific-two-symbol/39666263 ? noredirect = 1 # comment66640996_39666263_39666263 , но моя проблема не решена :(пожалуйста, помогите мне, если вы можете, мои образцы кодов во вчерашнем сообщении – SMW

ответ

1

Вы заменяете код, который не будет работать так, как он есть, поскольку он просто будет менять символы для одной и той же строки (вы меняете A на C, а позже вы меняете C на W, поэтому ваш последний первый персонаж будет W, а не C, как вы хотите).

Ниже приведен слишком сложный метод (я также добавил метод, который проходит через каждый символ строки, выполняющий замену), но он должен работать, и вы можете изменить по мере необходимости. Успехов

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
     string A = textBox1.Text.Trim(); 

     string[] Aarry = A.Split('|'); 
     string cleanedString = ""; 


     for (int i = 0; i < Aarry.Length; i++) 
     { 
      if (i % 2 == 0) 
       cleanedString += FixText(Aarry[i]) + " "; 
      else 
       cleanedString += Aarry[i] + " "; 
     } 

     textBox2.Text = cleanedString ; 

метод ниже будет пройти через каждый символ делает замену

public string FixText(string A) 
    { 

     string newText = ""; 

     for (int i = 0; i < A.Length; i++) 
     { 
      switch (A.Substring(i, 1)) 
      { 

       case "A": 
        newText += A.Substring(i, 1).Replace("A", "C"); 
        break; 
       case "F": 
        newText += A.Substring(i, 1).Replace("F", "H"); 
        break; 
       case "C": 
        newText += A.Substring(i, 1).Replace("C", "W"); 
        break; 
       case "B": 
        newText += A.Substring(i, 1).Replace("B", "G"); 
        break; 
       default: 
        break; 
      } 
     } 

     return newText; 
    } 

Для обработки> 500 строк типа замены у вас есть, вы могли бы настроить словарь, используя метод ниже:

public Dictionary<string, string> ReturnReplacementDictionary() 
    { 
     Dictionary<string, string> dictLibrary = new Dictionary<string,string)() 
     { 
      {"A","C"}, 
      {"F","H"}, 
      {"C","W"}, 
      {"B","G"} 

     }; 
     return dictLibrary; 
    } 

В приведенном выше вы просто добавили бы все свои другие значения замены.

Тогда вы назвали бы использовать этот метод ниже вместо кожуха переключателя (Если вы не добавить символ/замены к методу словаря вы можете увидеть это будет просто установить сменную символ пробел):

public string FixTextUsingDictionary(string A) 
    { 
     Dictionary<string, string> replaceDict = ReturnReplacementDictionary(); 
     string newText = ""; 

     for (int i = 0; i < A.Length; i++) 
     { 
      string replacementLetter=""; 
      if (replaceDict.TryGetValue(A.Substring(i, 1), out replacementLetter)) 
      { 
       newText += replacementLetter; 
      } 
      // Added so that if the char is not in the dictionary the output  will just have the original char 
      else { newText += A.Substring(i, 1); } 

     } 
     return newText; 

    } 

Успехов

+0

это решение для моей проблемы, действительно спасибо вам друг :) , но у этого есть маленькие проблема, у меня есть 500 <таких строк A = A.Replace («A», «C»); A = A.Заменить («B», «G»); так, как я могу сделать это без использования переключателя случая, иметь какой-либо короткий способ сделать это – SMW

+0

хорошо он работает правильно, в моем коде содержащий его коде, такие как, { «быть», «බෙ»}, { «bi», «බී»}, {«bi», «බි»}, {«b», «බ්»}, , которые являются символами Юникода, когда вывод типа «bii» будет «බ්» «только, и другое дело, что любой символ не в словаре (dictLibrary), ничего не будет отображаться в текстовом поле2 :(есть какое-либо решение ??? – SMW

+0

Я обновил вышеописанный метод и добавил оператор else, поэтому, если нет совпадения , вы получите исходный символ вывода – Darthchai

1

Если текст вводится вручную, не вставленный из буфера обмена, мое решение будет:

int counter = 0; 
    private string replaceSpecial(string A) 
    { 
     if (A.Equals("A")) return "C"; 
     else if (A.Equals("F")) return "H"; 
     else if (A.Equals("C")) return "W"; 
     else if (A.Equals("B")) return "G"; 
     else if (A.Equals("|")) return ""; 
     else return A; 
    } 

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar.Equals('|')) 
     { 
      counter++; 
     } 
     if (counter == 0 || counter % 2 == 0) 
      textBox2.Text += replaceSpecial(e.KeyChar.ToString()); 
     else 
      textBox2.Text += e.KeyChar.ToString().Replace("|", ""); 
    } 

, учитывая, что только вошел CHARAC ter - это «|». удача

+0

как я могу использовать это для Событие tBox1_TextChanged :( – SMW

+0

это решение основано на событии KeyPress, если вы ограничены событием TextChanged, вы можете использовать решение @darthchi. – AhmedAbdelaal

+0

ok спасибо :) – SMW

0
void StringReplace(string initialString) 
     { 
      bool insideSpecialCharacter = false; 
      string[] Pattern = { "A-C", "C-W", "F-H", "B-G" }; 
      string specialCharacter = "|"; 
      char[] characters = initialString.ToCharArray(); 

      char?[] Newcharacters = new char?[characters.Length]; 
      for (int i = 0; i < characters.Length; i++) 
      { 
       if (!characters[i].ToString().Equals(specialCharacter)) 
       { 
        if (insideSpecialCharacter) 
        { 
         Newcharacters[i] = characters[i]; 
        } 
        else 
        { 
         CheckPattern(Pattern, characters, Newcharacters, i); 
        } 
       } 
       else 
       { 
        insideSpecialCharacter = (insideSpecialCharacter) ? false : true; 
       } 
      } 
      txtSecond.Text = string.Concat(Newcharacters).Trim(); 
     } 

     //-------Checks the Pattern Array and Replaces the Characters----------- 

private static void CheckPattern(string[] Pattern, char[] characters, char?[] Newcharacters, int i) 
     { 
      for (int j = 0; j < Pattern.Length; j++) 
      { 
       string[] replaceValue = Pattern[j].Split('-'); 
       if (characters[i].ToString() == replaceValue[0]) 
       { 
        Newcharacters[i] = Convert.ToChar(characters[i].ToString().Replace(characters[i].ToString(), replaceValue[1])); 
        break; 
       } 
       else 
       { 
        Newcharacters[i] = characters[i]; 
       } 
      } 
     }