5

このコードは、リッチテキストボックスを検索し、配列の最初のフィールドを2番目のフィールドに置き換えます。2つのフィールドを除いて、すべて正常に動作します。

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){}
  }
}
4

1 に答える 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,}
};

また、通常の文字列置換は、上記の変更で正常に機能します。

于 2012-11-18T03:01:17.307 に答える