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

Fab*_*lva 7 c# regex linq string

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

我不知道好,如果正则表达式可以是最好的解决办法,而不是使用像.replace()或一个.remove()考取每个无效字符或别的东西.

任何帮助将不胜感激.

Joe*_*oey 17

您可以使用

Regex.Replace(myString, @"[^\x20-\xaf]+", "");
Run Code Online (Sandbox Code Playgroud)

这里正则表达式包括在字符类(的[...])由所有字符的(^在U + 0020到U + 00AF的范围在类的开始)(32-175,以十六进制符号表示).至于正则表达式,这个是相当基本的,但可能会困扰不熟悉它的人.

但你也可以走另一条路线:

new string(myString.Where(c => (c >= 32) && (c <= 175)).ToArray());
Run Code Online (Sandbox Code Playgroud)

这可能主要取决于你对阅读感觉更舒服.没有太多的正则表达式经验,我会说第二个会更清楚.

一些性能测量,每轮10000次,以秒为单位:

2000 characters, the first 143 of which are between 32 and 175
  Regex without +                          4.1171
  Regex with +                             0.4091
  LINQ, where, new string                  0.2176
  LINQ, where, string.Join                 0.2448
  StringBuilder (xanatos)                  0.0355
  LINQ, horrible (HatSoft)                 0.4917
2000 characters, all of which are between 32 and 175
  Regex without +                          0.4076
  Regex with +                             0.4099
  LINQ, where, new string                  0.3419
  LINQ, where, string.Join                 0.7412
  StringBuilder (xanatos)                  0.0740
  LINQ, horrible (HatSoft)                 0.4801
Run Code Online (Sandbox Code Playgroud)

所以是的,我的方法是最慢的:-).您可能应该使用xanatos的答案并将其包装在一个名称清晰的方法中.对于内联使用或快速和肮脏的事情或性能无关紧要,我可能会使用正则表达式.


xan*_*tos 7

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

var sb = new StringBuilder();

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

var str2 = str.ToString();
Run Code Online (Sandbox Code Playgroud)