注意:这不是一个简单的字符串替换问题。
我的情况如下,我有一个大字符串(< 1024B,但是> 300B),它有{#String}和{$ String}。
更具体{#SomethingBlahBlah}和{$ SomeOtherThingBlahBlah},所以在regexp {#w +}和{$ w +}
我的第一个问题是,regexps是唯一的方法吗?我喜欢字符串替换解决方案等,其次,如果是,有没有办法只做一个编译的正则表达式并进行单次传递?
Linq能帮忙吗?
答案 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没有使用字符串的直接方法。它只能使用现有功能。