C# 删除非ASCII 32到175 C字符的更好方法

C# 删除非ASCII 32到175 C字符的更好方法,c#,regex,string,linq,C#,Regex,String,Linq,我需要从字符串中删除不在32到175 Ascii范围内的字符,其他任何字符都必须删除 我不知道RegExp是否是最好的解决方案,而不是使用诸如.replace或.remove之类的方法来替换每个无效字符或其他东西 任何帮助都将不胜感激。您可以使用 Regex.Replace(myString, @"[^\x20-\xaf]+", ""); 这里的正则表达式由一个字符类[…]组成,该类由所有字符组成,这些字符不在类的开头,在U+0020到U+00AF32–175的范围内,以十六进制表示。就正则表

我需要从字符串中删除不在32到175 Ascii范围内的字符,其他任何字符都必须删除

我不知道RegExp是否是最好的解决方案,而不是使用诸如.replace或.remove之类的方法来替换每个无效字符或其他东西

任何帮助都将不胜感激。

您可以使用

Regex.Replace(myString, @"[^\x20-\xaf]+", "");
这里的正则表达式由一个字符类[…]组成,该类由所有字符组成,这些字符不在类的开头,在U+0020到U+00AF32–175的范围内,以十六进制表示。就正则表达式而言,这是一个相当基本的表达式,但可能会让不太熟悉它的人感到困惑

但你也可以走另一条路:

new string(myString.Where(c => (c >= 32) && (c <= 175)).ToArray());
所以是的,我的方法是最慢的:-。您可能应该使用xanatos的答案,并用一个好的、清晰的名称将其包装在一个方法中。对于内联使用、快速脏东西或性能无关紧要的地方,我可能会使用正则表达式。

使用正则表达式[^\x20-\xAF]+并用空字符串替换它


因为我认为,如果你不知道如何编写正则表达式,你就不应该使用它,特别是对于这么简单的事情:

var sb = new StringBuilder();

foreach (var c in str)
{
    if (c >= 32 && c <= 175)
    {
        sb.Append(c);
    }
}

var str2 = str.ToString();

这样使用linq怎么样

string text = (from c in "AAA hello aaaa #### Y world" 
               let i = (int) c where i < 32 && i > 175 select c)
              .Aggregate("", (current, c) => current + c);

你能不能用普通的字符串索引删除它们?可以将目标字符串分配为与源字符串相同的长度,因为可以保证其长度相同或更短。然后在循环中复制有效字符?这只是两个比较来检查是否有效。还有另一个char[]副本,因为字符串的长度将与以前相同,只是以零填充的方式。这就是我的想法。一个正则表达式调用似乎有点像OTT?我有一些非常类似的东西,除了一个额外的部分,试图将普通的高ascii转换为低ascii替代,即“对于@FabianSilva,我认为最好的学习方法不是去董事会问你能不能用一种我不懂的语言为我写一篇文章?在了解它之前,感谢你提出的不要使用regExp的建议,我编辑了这个标题,以更好地从c中非ascii字符的字符串中删除字符。更清楚的是,我会说西班牙语和ho请理解我的问题,抱歉,如果这个问题让您或本板上的任何ppl感到恼火……如果我不确定什么是最佳解决方案,请提出这样的问题,让我思考新的方法,以使我无法以最佳/高效的方式完成某些事情。在这种情况下,linq表达式更好。谢谢再次使用d如果c>=01&&c您应该使用+使其更快速谢谢,选择方法是一个很好的选择,正则表达式也可以分析它并了解更多。哇,很好的性能测试,我看到xanatos one是最好的,如果必须从大文本中删除字符,感谢您花时间测试它,在我的情况下,我将从短文本中删除字符字符串,似乎linq是我的选择,不是性能更高,也不是写得更短,而是很容易应用/写在一行句子中:再次感谢你,xanatos和所有回复的用户,性能取决于你做什么,多久做一次,以及在哪里花时间。例如,不带+的regex需要很长时间另一方面,如果要删除的字符很多,则如果要追加的字符更多,则使用StringBuilder需要更长的时间。有些方法会随输入字符串的长度而扩展,有些方法会随输出字符串的长度而扩展;几乎所有方法都有非常不同的开销。通常我的建议是编写您能读得最好的内容,并担心性能问题nce,如果它成为瓶颈。您可能不会连续10000次常规筛选半大字符串。感谢您的回复,您的linq表达式是一个很好的解决方案,但在我看来,joey表达式更容易理解。顺便说一句,感谢使用let和aggregate的替代解决方案
var sb = new StringBuilder();

foreach (var c in str)
{
    if (c >= 32 && c <= 175)
    {
        sb.Append(c);
    }
}

var str2 = str.ToString();
string text = (from c in "AAA hello aaaa #### Y world" 
               let i = (int) c where i < 32 && i > 175 select c)
              .Aggregate("", (current, c) => current + c);
static unsafe string TrimRange(string str, char from, char to)
{
    int count = 0;

    for (int i = 0; i < str.Length; i++)
    {
        char ch = str[i];

        if ((ch >= from) && (ch <= to))
        {
            count++;
        }
    }

    if (count == 0)
        return String.Empty;

    if (count == str.Length)
        return str;

    char * result = stackalloc char[count];

    count = 0;

    for (int i = 0; i < str.Length; i++)
    {
        char ch = str[i];

        if ((ch >= from) && (ch <= to))
        {
            result[count ++] = ch;
        }
    }

    return new String(result, 0, count);
}