替换字符串中的非字母字符

时间:2013-12-18 20:45:42

标签: c#

我正在尝试取一个字符串并用空格替换不是A-Z的所有内容。因此,例如“AB $ CD $ EF”应该输出“AB CD EF”

我遇到的问题是以下错误:

实例参数:无法从'string []'转换为'System.Linq.IQueryable'

代码:

        string[] alpha = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
        string inVAR = textBox1.Text.ToUpper();
        string outVAR;

        StringBuilder sb = new StringBuilder(inVAR);

        foreach (int i in inVAR) // inVAR because stringbuilders won't work with foreach
        {
            if (alpha.Contains(sb[i]))
            {
                outVAR += sb[i].ToString();
            }
            else
            {
                sb[i] = ' ';
            }
        }

另外,如果你有一种不同的A-Z阵列方式,我是开放的! :P

记录:是的,我已经包含了System.Linq

7 个答案:

答案 0 :(得分:6)

也许您可以使用RegEx:

Regex rgx = new Regex("[^a-zA-Z -]");
str = rgx.Replace(str, " ");                                      

然后你可以随心所欲地替换它或做它。 我希望我理解你的问题;)

答案 1 :(得分:3)

你有很多选择。例如,

var strNew1 = Regex.Replace("AB$CD$EF", @"[^A-Z]", " ");

var strNew2 = new string("AB$CD$EF".Select(c => c >= 'A' && c <= 'Z' ? c : ' ')
                                   .ToArray());

答案 2 :(得分:2)

您可以使用正则表达式使用几行简单的代码来完成此操作。

string inVAR = textBox1.Text.ToUpper();
string pattern = "[^A-Z]";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(inVAR, replacement);

答案 3 :(得分:1)

您的代码令人困惑。我想你想要的是:

    string[] alpha = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
    string inVAR = textBox1.Text.ToUpper();
    string outVAR;

    StringBuilder sb = new StringBuilder(inVAR);

    foreach (char c in inVAR) // inVAR because stringbuilders won't work with foreach
    {
        if (!alpha.Contains(c))
        {
            sb[i] = ' ';
        }
    }

    outVAR = sb.ToString();

你真的不需要alpha数组。您可以拨打char.IsUpper

if (!char.IsUpper(c))

或者,正如其他人所指出的那样,您可以使用正则表达式来完成此任务。

答案 4 :(得分:0)

你可以试试这个:

Regex rxNonAlpha = new Regex( "[^A-Z]" , RegexOptions.IgnoreCase ) ;
string someText = GetSomeText() ;
string tidiedText = rxNonAlpha.Replace( someText , " " ) ;

或者,利用ASCII / Unicode A-Z和a-z是连续代码点的事实:

string Tidy( string s )
{
  StringBuilder sb = new StringBuilder( s.Length ) ;

  foreach ( char c in s )
  {
    bool isLowerCase = ( c >= 'a' && c <= 'z' ) ;
    bool isUpperCase = ( c >= 'A' && c <= 'Z' ) ;
    bool isAlpha     = isLowerCase || isUpperCase ;
    sb.Append( isAlpha ? c : ' ' ) ;
  }

  return sb.ToString() ;
}

答案 5 :(得分:0)

您可以使用正则表达式。

这应该用空格(未经测试)替换上面的小写字母字符:

Regex rgx = new Regex("[^a-zA-Z]");
outVAR = rgx.Replace(textBox1.Text, " ");

答案 6 :(得分:0)

我会使用正则表达式而不是遍历整个字符串。内存需求略微更快,速度更快。

    string inputString = "[whatever your string is]";
    Regex replacelist = new Regex("[;\\\\/:*?\"<>|&'$]");
    string outputString = replacelist.Replace(inputString," ");

我没有直接测试过,但Regex的概念非常简单。