寻找在另一个字符串中搜索和替换字符串的最佳方法

时间:2011-12-30 16:14:00

标签: c# .net string replace

我正在编写一个过滤很多值的类。在另一个字符串中搜索/删除/替换字符串的最佳方法是什么?

例如:

name +value (email)

电子邮件,如何使用它? LINQ?还是.Split()?或正则表达式?

哪种表现最佳?

目前我正在使用它:

string[] parts = val.Split('(');

string Email = parts[1].Replace(")", String.Empty);

4 个答案:

答案 0 :(得分:2)

我建议使用正则表达式,因为我认为它是出于这个原因而发明的,它是在字符串和字符串替换中搜索。

答案 1 :(得分:2)

如果我正确理解了您的问题,那么您正试图用可能从其他来源提供的电子邮件替换(电子邮件)的文字

var text = "name +value (email)";
var emailAddress = "someone@test.com";
text = Regex.Replace(text, @"\(email\)", emailAddress);

上面的代码块会将'(email)'替换为emailAddress变量的内容

请务必将相应的using语句添加到代码文件的顶部

using System.Text.RegularExpressions;

答案 2 :(得分:2)

在我的机器上,代码的变体是最快的(你的代码是第二个)。

注意单位!! 蜱虫以100纳秒为增量。

SplitReplace takes 0.961795 ticks per call
Split takes 0.747009 ticks per call      
Regex takes 2.512739 ticks per call
WithLinq takes 2.59299 ticks per call

我的变化只是分裂(没有替换):

string[] parts = val.Split('(', ')');
return parts[1];

测试代码......

[Test]
public void SO()
{
    const string input = "name +value (email)";

    TestGivenMethod(input, SplitReplace, "SplitReplace");
    TestGivenMethod(input, JustSplit, "Split");
    TestGivenMethod(input, WithRegex, "Regex");
    TestGivenMethod(input, WithLinq, "WithLinq");
}

private void TestGivenMethod(string input, Func<string, string> method, string name)
{
    Assert.AreEqual("email", method(input));

    var sw = Stopwatch.StartNew();
    string res = "";

    for (int i = 0; i < 1000000; i++)
    {
        var email = method(input);
        res = email;
    }

    sw.Stop();

    Assert.AreEqual("email", res);
    Console.WriteLine("{1} takes {0} ticks per call", sw.ElapsedTicks/1000000.0, name);
}

string SplitReplace(string val)
{
    string[] parts = val.Split('(');
    return parts[1].Replace(")", String.Empty);
}

string JustSplit(string val)
{
    string[] parts = val.Split('(', ')');
    return parts[1];
}

private static Regex method3Regex = new Regex(@"\(([\w@]+)\)");
string WithRegex(string val)
{
    return method3Regex.Match(val).Groups[1].Value;
}

string WithLinq(string val)
{
    return new string(val.SkipWhile(c => c != '(').Skip(1).TakeWhile(c => c != ')').ToArray());
}

答案 3 :(得分:0)

String.Split相比,

Regular Expression是最简单易懂的方法,我不确定如何在这里使用LINQ。

就性能而言,最好能够对测试数据进行分析,以查看正则表达式和String.Split之间的实际性能差异