繁体   English   中英

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

[英]Replacing specific numbers with String.Replace or Regex.Replace

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

例如,在字符串中

@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

对解决方案有何想法?

我希望采用更具声明性的方式来执行此操作。 如果还会有其他替换,例如将@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字典中的正确条目替换此匹配项,其中键是匹配值本身。

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

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. 它不会为每个参数创建临时字符串。 对于服务器应用程序来说这可能是一个问题,因为大量的孤立字符串将对垃圾收集器施加压力

之所以具有优势3-4,是因为正则表达式将解析输入并创建一个内部表示,其中包含任何匹配项的索引。 当需要创建最终字符串时,它使用StringBuilder从原始字符串中读取字符,但是在遇到匹配项时替换替换值。

首先从最大(读取最长)的数字开始,例如@ 11和@ 10,然后替换@ 1。

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

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

后面的空格将确保仅得到数字@ 1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM