C#使用RegEx和字典替换“仅限整个单词”

时间:2017-12-29 12:03:18

标签: c# regex dictionary design-patterns replace

我想创建代码,替换一个文件中包含的单词,使用另一个文本文件作为字典(结构:Key sep.:tab Value)。

当前代码:

var fileDictionary = new Dictionary<string, string>
   File.ReadLines(dictionaryPath, Encoding.Default)
  .Select(line => line.Split('  '))
  .ToDictionary(data => data[0], data => data[1]), StringComparer.InvariantCultureIgnoreCase);//create dictionary based on text file

for (int i = 0; i < rowNumber; i++)
{
   var output = fileString[i].ToString();// current row, taked from other file
   var replaced = Regex.Replace(output, String.Join("|", fileDictionary.Keys.Select(Regex.Escape)), m => fileDictionary[m.Value], RegexOptions.IgnoreCase);
   var result = replaced.ToString();
   outputFile += result.ToString();
   outputFile += "\r\n";
}

到目前为止,一切正常,我正在使用RegEx来替换字典中收集的单词,但是我有一个问题就是替换“仅限整个单词”。

我决定使用像@“\ bsomeword \ b”这样的模式,但是当我按照下面的描述实现它时:

 var replaced = Regex.Replace(output, String.Join("|", 
         String.Format(@"\b{0}\b", 
         fileDictionary.Keys.Select(Regex.Escape))), 
         m => fileDictionary[m.Value], RegexOptions.IgnoreCase);

代码不会返回任何结果。最终文本文件看起来像原始文件。什么都没发生。我意识到,问题出现在字典键中,当我使用模式时,我实际上更改了键,而当前字典中不存在新键。因此,如果密钥不存在,则不会替换该值。

有人建议如何解决这个问题吗?或者也许有人知道其他一些方法来替换整个单词,使用RegEx和字典?

1 个答案:

答案 0 :(得分:1)

看起来这个模式没有从字典中正确解析

 var replaced = Regex.Replace(fileString, String.Join("|", fileDictionary.Select(m => @"\b" + Regex.Escape(m.Key) + @"\b")), m => fileDictionary[m.Value], RegexOptions.IgnoreCase);

使用StringBuilder进行输出也会更有效。