用String.Replace或Regex.Replace替换特定数字

时间:2014-06-27 14:07:16

标签: c# asp.net regex

在尝试字符串或正则表达式替换字符串中的特定数字时遇到一些问题。

例如,在字符串

@1 is having lunch with @10 @11

我想替换" @ 1"," @ 10"和" @ 11"具有如下所示的相应值。

"@1" replace with "@bob"
"@10" replace with "@joe"
"@11" replace with "@sam"

所以最终输出看起来像

"@bob is having lunch with @joe @sam"

尝试

String.Replace("@1", "@bob")

结果如下

@bob is having lunch with @bob0 @bob1

关于解决方案可能是什么的任何想法?

4 个答案:

答案 0 :(得分:3)

我希望更多的声明方式来做到这一点。如果有其他替代品会怎样,例如@2更改为luke?您必须更改代码(添加另一个Replace电话)。

我对替换声明的提议:

string input = "@1 is having lunch with @10 @11";
var rules = new Dictionary<string,string>() 
{
    { "@1", "@bob" },
    { "@10", "@joe" },
    { "@11", "@sam"}
};

string output = Regex.Replace(input, 
                              @"@\d+", 
                              match => rules[match.Value]);

说明:

正则表达式正在搜索模式@\d+,这意味着@后跟一个或多个数字。感谢MatchEvaluator通过rules字典中的正确条目替换此匹配,其中键是匹配值本身。

答案 1 :(得分:2)

假设所有占位符都以@开头并且只包含数字,您可以使用接受MatchEvaluator委托的Regex.Replace重载来从字典中选择替换值:

var regex = new Regex(@"@\d+");

var dict = new Dictionary<string, string>
{
    {"@1","@bob"},
    {"@10","@joe"},
    {"@11","@sam"},
};

var input = "@1 is having lunch with @10 @11";
var result=regex.Replace(input, m => dict[m.Value]);

结果将是"@bob is having lunch with @joe @sam"

与多个String.Replace调用相比,有一些优势:

  1. 对于任意数量的占位符,代码更简洁
  2. 您可以避免由于替换顺序导致的错误(例如@11必须在@1之前)
  3. 它更快,因为您不需要多次搜索和替换占位符
  4. 它不会为每个参数创建临时字符串。这可能是服务器应用程序的一个问题,因为大量的孤立字符串会对垃圾收集器施加压力
  5. 优势3-4的原因是正则表达式将解析输入并创建包含任何匹配的索引的内部表示。当创建最终字符串时,它使用StringBuilder从原始字符串中读取字符,但在遇到匹配时替换替换值。

答案 2 :(得分:1)

首先使用最大(读取时间最长)的数字,例如@ 11和@ 10,然后替换@ 1。

string finalstring = mystring.Replace("@11", "@sam")
                             .Replace("@10", "@joe")
                             .Replace("@1", "@bob");

答案 3 :(得分:0)

使正则表达式查找字符串@ 1 _

之后的空格将确保它只获得数字@ 1。