2012-05-22 225 views
1

我创建了一个简单的程序,我想用字符串数组中的其他字符替换一些字符。我创建了一个包含某些字词的字符串数组,我想循环每个单词并检查如果它包含了一些字符,但是当我试图取代什么也没有发生 这里是我的代码替换字符串中的字符

  string x = ""; 
      x = "Script friends above about type=text/javascript>BBC.adverts.writeleaderboardtrue) all </script>friends,eating,khaled,khaled,khaled"; 
char[] delimiterChars = { ' ', ',', '.', ':', '\t', ':', '$', '=', ';', '<', '>', '!', ';', ']', '[', '"', 
            '/','=','-','?'}; 
string[] words = x.Split(delimiterChars); 
      for (int j = 0; j < words.Length; j++) 
      { 
       words[j] = words[j].ToLower(); 
      } 
for (int i = 0; i < words.Length; i++) 
      { 
       for (int j = 0; j < words[j].Length; j++) 
       { 

        if (words[i][j]=='a'||words[i][j]=='e'||words[i][j]=='i'||words[i][j]=='o'||words[i][j]=='u' 
         ||words[i][j]=='h'||words[i][j]=='w'||words[i][j]=='y') 
        { 
         words[i].Replace(words[i][j],'0'); 
        } 
        else if (words[i][j] == 'b' || words[i][j] == 'f' || words[i][j] == 'p' || words[i][j] == 'v') 
        { 
         words[i].Replace(words[i][j], '1'); 
        } 

        else if (words[i][j] == 'c' || words[i][j] == 'g' || words[i][j] == 'j' || words[i][j] == 'k' 
        || words[i][j] == 'q' || words[i][j] == 's' || words[i][j] == 'x' || words[i][j] == 'z') 
       { 
        char xx = words[i][j]; 
        words[i].Replace(xx, '2'); 
        Console.WriteLine(words[i]); 
       } 
       else if (words[i][j] == 'd' || words[i][j] == 't') 
       { 
        words[i].Replace(words[i][j], '3'); 
       } 
       else if (words[i][j] == 'l') 
       { 
        words[i].Replace(words[i][j], '4'); 
       } 
       else if (words[i][j] == 'm' || words[i][j] == 'n') 
       { 
        words[i].Replace(words[i][j], '5'); 
       } 
       else if (words[i][j] == 'r') 
       { 
        words[i].Replace(words[i][j], '6'); 
       } 



} 
} 

回答

3

你忘记了,字符串是不可变的。

words[i].Replace(words[i][j], '1')返回一个带有替换值的新字符串实例。

你有你的引用赋值回到新生成的String对象:

words[i] = words[i].Replace(words[i][j], '1'); 
2

.Replace操作不发生变异的原始字符串。您必须将结果设置回源变量以应用更改。

words[i] = words[i].Replace(words[i][j], '0'); 

注意更换适用于整个字符串,因此搜索每一个ae等逐个字母和调用替换是多余的。你可以这样做:

words[i] = words[i].Replace('a', '0'); 
words[i] = words[i].Replace('e', '0'); 
// etc.. 

或更好,但使用正则表达式:

1

您可以使用Regex.Replace,使在比赛同样的事情更加紧凑和有效的方式。也就是说,这样的:

  for (int j = 0; j < words[j].Length; j++) 
      { 

       if (words[i][j]=='a'||words[i][j]=='e'||words[i][j]=='i'||words[i][j]=='o'||words[i][j]=='u' 
        ||words[i][j]=='h'||words[i][j]=='w'||words[i][j]=='y') 
       { 
        words[i].Replace(words[i][j],'0'); 
       } 

可以用一个简单的正则表达式替换替换这样的:

Regex re0 = new Regex("[aeiouhwy]"); // match any of this chras 
    string changedWord = re0.Replace(word,"0"); 

你甚至可以连锁调用Replace方法是这样的:

Regex re0 = new Regex("[aeiouhwy]"); // match any of this chras 
    Regex re1 = new Regex("[bfpv]"); 
    string changedWord = re0.Replace(word,"0"); 
    changedWord = re1.Replace(changedWord,"1") 

等。易于编写和理解,并且更高效。