如何在正则表达式中转义特殊字符?

5

这段代码可以搜索一个RichTextBox并将数组的第一个字段替换为第二个字段。除了两个字段,所有内容都可以正常工作。

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

以下是将数组转换为所需结果的部分代码:
```html

这是将数组转换为所需结果的部分:

```
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分钟前由“Bart”编辑的。谢谢。 - user1667191
你为什么要使用正则表达式?为什么不直接使用普通的String.Replace函数呢? - Patrick Quirk
我也尝试过这种方法,但它仍然产生了我的原始问题。 - user1667191
1个回答

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,}
};

经过上述更改后,普通字符串替换将可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接