【问题标题】:Replacing non-alphabet characters in a string替换字符串中的非字母字符
【发布时间】:2013-12-18 20:45:41
【问题描述】:

我正在尝试获取一个字符串并将所有不是 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

【问题讨论】:

标签: c#


【解决方案1】:

也许您可以为此使用 RegEx:

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

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

【讨论】:

  • 他想用空格代替,而不是用null。
  • 是的,刚刚编辑过 ;) 就像我说的,他可以随心所欲地做他想做的事...但是好的,已修复 :)
  • 完全没有问题 ;)
【解决方案2】:

你有很多选择。例如,

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

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

【讨论】:

  • 我喜欢第一个例子,谢谢!如果多米尼克的代码不适合我,我会使用你的。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

        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))
    

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

    【讨论】:

      【解决方案5】:

      你可以使用正则表达式。

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

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

      【讨论】:

        【解决方案6】:

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

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

        我没有直接测试过,但是使用正则表达式的概念非常简单。

        【讨论】:

          【解决方案7】:

          你可以试试这个:

          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() ;
          }
          

          【讨论】:

          • 也许您也应该添加像“a-z”这样的小字符! ;)
          • Err...我的代码同时接受小写和大写字母。您可能会注意到正则表达式构造函数中的RegexOptions.IgnoreCase,以及初始化isAlpha 中的比较。但是,哎呀,我调整了代码以使其更清晰。
          • 对不起,我的错,我没注意那个!
          猜你喜欢
          • 2017-07-09
          • 2012-10-10
          • 2012-09-04
          • 2010-12-20
          • 2012-05-31
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          相关资源
          最近更新 更多