以高效的方式替换字符串中的{#Text}和{$ Text}

时间:2010-10-15 21:28:34

标签: c# regex linq

注意:这不是一个简单的字符串替换问题。

SomethingBlahBlah可以#SomeThingOtherthanThis

我的情况如下,我有一个大字符串(< 1024B,但是> 300B),它有{#String}和{$ String}。

更具体{#SomethingBlahBlah}和{$ SomeOtherThingBlahBlah},所以在regexp {#w +}和{$ w +}

我的第一个问题是,regexps是唯一的方法吗?我喜欢字符串替换解决方案等,其次,如果是,有没有办法只做一个编译的正则表达式并进行单次传递?

Linq能帮忙吗?

5 个答案:

答案 0 :(得分:2)

对于大字符串和几种不同的替换,我建议使用StringBuilder。

StringBuilder sb = new StringBuilder(input);
sb.Replace("{$String}", "Real Value");
sb.Replace("{$SomeOtherThingBlahBlah}", "Another Real Value");
return sb.ToString();

操作将在内存中进行,并且在调用ToString()之前不会分配新的字符串。

答案 1 :(得分:1)

您可以使用以下方法之一:

选项1

正则表达式:

\{(?:#|\$)(\w+)}

文本:

{#SomethingBlahBlah} and {$SomeOtherThingBlahBlah}

返回:

Result 1

   1. SomethingBlahBlah

Result 2

   1. SomeOtherThingBlahBlah

选项2

正则表达式:

(\{(?:#|\$)(?:\w+)})

文本:

{#SomethingBlahBlah} and {$SomeOtherThingBlahBlah}

返回:

Result 1

   1. {#SomethingBlahBlah}

Result 2

   1. {$SomeOtherThingBlahBlah}

答案 2 :(得分:1)

IndexOf vs Regex:使用Stopwatch测试超过100000次迭代并使用500长度字符串进行测试。

Method IndexOf

public static string Re(string str)
{
    int strSIndex = -1;
    int strEIndex = -1;

    strSIndex = str.IndexOf("{#");
    if (strSIndex == -1) strSIndex = str.IndexOf("{$");
    if (strSIndex == -1) return str;

    strEIndex = str.IndexOf("}");
    if (strEIndex == -1) return str;

    if (strEIndex < strSIndex)
    {
        strSIndex = str.IndexOf("{$");
        if (strSIndex == -1) return str;
    }

    str = str.Substring(0, strSIndex) + str.Substring(strEIndex + 1);

    return Re(str);
}

正则表达式方法

Regex re = new Regex(@"\{(?:#|\$)(\w+)}", RegexOptions.Compiled);
re.Replace(str, "");

结果(很少替换):

Fn: IndexOf
Ticks: 1181967

Fn: Regex
Ticks: 1482261

请注意,regex在迭代之前设置为编译。

结果(大量替换):

Fn: Regex
Ticks: 19136772

Fn: IndexOf
Ticks: 37457111

答案 3 :(得分:0)

String.Replace("SomethingBlahBlah", "SomeOtherThingBlahBlah")

编辑:刚刚在此thread找到了Jon Skeet的精彩答案。

答案 4 :(得分:0)

Regex需要更多时间来替换文本而不是使用String.Replace方法。但是Regex通过文本操作为您提供了巨大的力量。 LINQ没有使用字符串的直接方法。它只能使用现有功能。