我想创建代码,替换一个文件中包含的单词,使用另一个文本文件作为字典(结构: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和字典?
答案 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进行输出也会更有效。