从String中删除除字母表之外的所有内容

MBZ*_*MBZ 2 .net c# regex linq string

我想以有效的方式从给定的字符串中删除任何字符,但字母.有什么建议吗?

Bla*_*ear 9

var result = str.Where(c => char.IsLetter(c));
Run Code Online (Sandbox Code Playgroud)

我对@ KirillPolishchuk的回答非常感兴趣,所以我刚用LINQPad做了一个小基准,使用随机构建的字符串,这里是完整的代码(虽然它返回了一个IEnumerable,我不得不略微更改我的原始代码):

void Main()
{
    TimeSpan elapsed;
    string result;

    elapsed = TheLINQWay(buildString(1000000), out result);
    Console.WriteLine("LINQ way: {0}", elapsed);

    elapsed = TheRegExWay(buildString(1000000), out result);
    Console.WriteLine("RegEx way: {0}", elapsed);
}

TimeSpan TheRegExWay(string s, out string result)
{
    Stopwatch stopw = new Stopwatch();

    stopw.Start();
    result = Regex.Replace(s, @"\P{L}", string.Empty);
    stopw.Stop();

    return stopw.Elapsed;
}

TimeSpan TheLINQWay(string s, out string result)
{
    Stopwatch stopw = new Stopwatch();

    stopw.Start();
    result = new string(s.Where(c => char.IsLetter(c)).ToArray());
    stopw.Stop();

    return stopw.Elapsed;
}

string buildString(int len)
{
    byte[] buffer = new byte[len];
    Random r = new Random((int)DateTime.Now.Ticks);

    for(int i = 0; i < len; i++)
        buffer[i] = (byte)r.Next(256);

    return Encoding.ASCII.GetString(buffer);
}
Run Code Online (Sandbox Code Playgroud)

这是结果:

LINQ way: 00:00:00.0150030
RegEx way: 00:00:00.2788130
Run Code Online (Sandbox Code Playgroud)

但仍然需要说一句话:正如Servy在他的评论中指出的那样,正则表达式更短,字符串更短.

  • 您可能想要检查LINQ方法,因为结果不会返回您的想法.即每次都会返回一个空字符串.这肯定会扭曲结果. (3认同)
  • 请注意,可以编译正则表达式,因此如果它运行在很多小字符串而不是一个大字符串(甚至几个大字符串)上,它的相对性能可能会提高.您的LINQ方法还使用字符串连接来连接每个char.为什么不使用`new string(linqquery.ToArray())`或stringbuilder?最后,您的LINQ查询实际上从未被枚举,它只是构建的,这就是为什么您的测试在这里有更快的速度.它实际上并没有产生任何输出. (3认同)

Kir*_*huk 6

使用:

var result = Regex.Replace(input, @"\P{L}", string.Empty);
Run Code Online (Sandbox Code Playgroud)