如何逃避正则表达式中的特殊字符?

时间:2012-11-18 02:32:08

标签: c# regex

此代码搜索richtextbox并将数组的第一个字段替换为第二个字段。除了两个字段外,一切正常。

iEmo = new string[,] {
  {@":\)",    Smile},
  {@":\(",    Sad},
  {@"8\)",    Cool},
  {@":\|",    Neutral},
  {@";\)",    Wink},
  {@">:\(",   Evil},    // Won't work for this one
  {@">:D",    Twisted}, // Or this one
  {@":\?",    Question,}
};

这是将数组转换为我想要的部分:

public void SetSmiley(RichTextBox RichBox) {
  for (int i = 0; i < (iEmo.Length / 3); i++) {
    try {
      RichBox.Rtf = Regex.Replace(RichBox.Rtf, iEmo[i, 0], iEmo[i, 1], RegexOptions.IgnoreCase);
    }
    catch (Exception e){}
  }
}

1 个答案:

答案 0 :(得分:5)

你的正则表达式看起来不错,但我看到一些阻止它工作的东西:

for (int i = 0; i < (iEmo.Length / 3); i++)

我不知道你为什么要除以3.你应该在这里使用第一个维度的长度:

for (int i = 0; i < iEmo.GetLength(0); i++)

此外,由于替换发生的顺序,正常的皱眉":("将在“邪恶”面">:("之前被替换。当循环到达恶案时,字符串看起来像">Sad"。你应该以递减的复杂性重新安排替换,如下所示:

iEmo = new string[,]
{
    {@">:\(",   Evil},
    {@":\)",    Smile},
    {@":\(",    Sad},
    {@"8\)",    Cool},
    {@":\|",    Neutral},
    {@";\)",    Wink},
    {@">:D",    Twisted},
    {@":\?",    Question,}
};

再次,正常的字符串替换将适用于上述更改。