[英]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
调用相比,有一些优点:
@11
必须在@1
之前) 之所以具有优势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.