当前位置: 代码迷 >> C# >> 请问一个高效快速的字符串替换方法
  详细解决方案

请问一个高效快速的字符串替换方法

热度:55   发布时间:2016-05-05 02:59:21.0
请教一个高效快速的字符串替换方法。

假设有一个很长的字符串  string a = "... name=\"key1\"  ...... name=\"key2\" ... name=\"keyxxx\" ..."
其中key1, key2, ...并没有顺序,是任意值。

还有一个List<object> 包含了所有string a 里面的key 值,{key1='zhao', key2='qian',......, keyxxx='yyy' '}
string a 里面的所有name对应的key值都可以在这里找到,并且是唯一的。

我想得到的结果是把string a替换成如下格式,也就是增加一个val的字段,把key的值带出来。
 "... name=\"key1\" val=\"zhao\"  ...... name=\"key2\" val=\"qian\" ... name=\"keyxxx\" val=\"yyy\"  "


因为这是一个很长的字符串a, 有上千个name=; 如果不用foreach这样的循环,可否有一个更高效的方式得到想要的结果呢 - 比如可否一次性匹配?

多谢!
------解决思路----------------------
http://bbs.csdn.net/topics/391825024
你可以参考这个帖子,分割后再替换,最后在重新组织
------解决思路----------------------
Dictionary<string, string> dic = new Dictionary<string, string>()
{
    {"key1","replace1"},
    {"key2","replace2"}
};
Console.WriteLine(Regex.Replace("... name=\"key1\"  ...... name=\"key2\" ... name=\"keyxxx\" ...", @"(?<="")[^""]*(?="")", m =>
{
    if (dic.ContainsKey(m.Value))
    {
        return dic[m.Value];
    }
    return m.Value;
}));

用正则对这么长的字符串效率方面可能会比第一个差点
------解决思路----------------------
你的 List<object> 应该是一颗 trie 树
如果这棵树已被你构造成功,那么只需对 a 做一趟扫描就可以了
------解决思路----------------------
建议你把List<object>换成NameValueCollection或者Dictionary
Regex.Replace(str, "name=\"(key\\d+)\"", m => m.Value + " val=\"" + values[m.Groups[1].Value]  + "\"");

------解决思路----------------------
那就还按Dictionary来,你自己将文本弄的复杂一些,不过规则不要改变,将字符串长度弄大一些,放到1万左右测试,看看时间。

Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"key1","A"},
{"key2","B"},
{"key3","C"},
{"key4","D"},
};
string k = "123456 <*> name=\"key1\" <kkkjjj> name=\"key2\" name=\"key3\"*";
string[] qwe, sp = new string[] { " name=\"" };
StringSplitOptions sso = StringSplitOptions.RemoveEmptyEntries;
var kk = k.Split(sp, sso).Select((p, i) =>
{
qwe = p.Split('"');
if (qwe.Length == 1 
------解决思路----------------------
 i == 0) return p;
qwe[1] = " val=\"" + (dic.ContainsKey(qwe[0]) ? dic[qwe[0]] : "") + "\"" + qwe[1];
qwe[0] = "name=\"" + qwe[0] + "\"";
return string.Join("", qwe);
}).ToArray();

Console.WriteLine(string.Join(" ", kk));

------解决思路----------------------
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"kkk","zhao"},
{"ee2","qian"},
{"abac","sun"}
};
Console.WriteLine(Regex.Replace("... name=\"kkk\"  ...... name=\"ee2\" ... name=\"abac\" ...", @"""([^""]*)""", m =>
{
    string value = "";
    if (dic.ContainsKey(m.Groups[1].Value))
    {
        value = dic[m.Groups[1].Value];
    }
    return string.Format(@"{0} val=""{1}""", m.Value, value);
}));

好吧,现在是测试过的了
------解决思路----------------------

  相关解决方案