使用Regex.Replace()代替string.Replace()

时间:2018-07-21 12:54:50

标签: c# regex

我有一个Dictionary<string , string> dict和一个string script。 我想用字典中相应的key替换scriptvalue的每个dict,以这样的方式来替换只有与键相同的标记。

示例

字典"name" : "John" "age" : "34" 具有以下条目:

string script = " The name and the fathersname and age and age_of_father "

script = " The John and the fathersname and 34 and the age_of_father "

替换后的输出应为:

string.Replace()

我尝试使用Regex.Replace(),但不起作用。如何使用import idb from 'idb'; await idb.open(…); 和Lookahead的概念来完成此任务?

2 个答案:

答案 0 :(得分:1)

让我们匹配每个单词 \w+最简单的模式:单词是一个或多个unicode单词字符的序列),并检查(在词典的帮助下)是否应该替换为:

Dictionary<string, string> dict = 
  new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
    { "name", "John"},
    { "age", "34"}
  };

string script = " The name and the fathersname and age and age_of_father ";

//  The John and the fathersname and 34 and age_of_father 
string result = Regex.Replace(
  script,
 @"\w+",   // match each word
  match => dict.TryGetValue(match.Value, out var value) // should the word be replaced? 
    ? value          // yes, replace
    : match.Value);  // no, keep as it is

答案 1 :(得分:0)

在您的问题中“无效”是什么意思?你在看什么您的代码是什么样的?

请记住,字符串是不可变的,并且string.Replace不会更改原始字符串,它会返回更改后的新字符串。

对于这样的事情(在进行大量替换时循环),StringBuilder.Replace通常是一个更好的选择。 StringBuilder实例是可变的,因此StringBuilder.Replace可以就地执行其工作。

执行以下操作:

  • 使用脚本字符串初始化StringBuilder
  • 遍历您的词典进行替换
  • 完成后,在StringBuilder上调用ToString以获取结果

我希望有一种方法可以使StringBuilder和Regex一起工作。