3

我有一个 foreach 语句,它正在搜索 a 中的字符串值List<string>。如果正在读取的当前行包含字符串,我想替换它,但有一些警告。

foreach (string shorthandValue in shorthandFound)
{
    if (currentLine.Contains(shorthandValue))
    {
        // This method creates the new string that will replace the old one.
        string replaceText = CreateReplaceString(shorthandValue);
        string pattern = @"(?<!_)" + shorthandValue;
        Regex.Replace(currentLine, pattern, replaceText);
        // currentline is the line being read by the StreamReader.
     }
}

shorthandValue如果前面有下划线字符 ( "_") ,我试图让系统忽略该字符串。否则,我希望它被替换(即使它位于行首)。

我做错了什么?

更新

这大部分工作正常:

Regex.Replace(currentFile, "[^_]" + Regex.Escape(shorthandValue), replaceText);

但是,虽然它确实忽略了下划线,但它会删除 shorthandValue 字符串之前的任何空格。因此,如果行读取“这是一个 test123。”,并且“test123”被替换,我最终得到这个结果:

“这是一个快捷方式的价值。”

为什么要删除空间?

再次更新

我将正则表达式改回我的(?<!_),它保留了空格。

4

2 回答 2

4

你的正则表达式是正确的。问题是 Regex.Replace 返回一个新字符串。

您忽略了返回的字符串。

于 2013-01-15T18:23:25.167 回答
2

您的正则表达式看起来是正确的,因为您修复了代码以实际保存字符串(@jameskyburz的帽子提示),因此您仍应确保将shorthandValue其视为文字。要完成此用途Regex.Escape

var pattern = String.Format(@"(?<!_){0}", Regex.Escape(shorthandValue))
于 2013-01-15T18:21:45.593 回答