在尝试字符串或正则表达式替换字符串中的特定数字时遇到一些问题。
例如,在字符串
中@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
关于解决方案可能是什么的任何想法?
答案 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
调用相比,有一些优势:
@11
必须在@1
之前)优势3-4的原因是正则表达式将解析输入并创建包含任何匹配的索引的内部表示。当创建最终字符串时,它使用StringBuilder从原始字符串中读取字符,但在遇到匹配时替换替换值。
答案 2 :(得分:1)
首先使用最大(读取时间最长)的数字,例如@ 11和@ 10,然后替换@ 1。
string finalstring = mystring.Replace("@11", "@sam")
.Replace("@10", "@joe")
.Replace("@1", "@bob");
答案 3 :(得分:0)
使正则表达式查找字符串@ 1 _
之后的空格将确保它只获得数字@ 1。