如果使用正则表达式替换匹配,只有在它没有给定字符之前?

时间:2013-01-15 18:13:17

标签: c# .net regex

我有一个foreach语句,正在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字符串之前删除了任何空格。因此,如果该行显示“This is a test123。”,并且“test123”被替换,我最终得到了这个结果:

“这是一个不错的选择。”

为什么要删除空间?

再次更新

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

2 个答案:

答案 0 :(得分:3)

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

您忽略了返回的字符串。

答案 1 :(得分:1)

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

var pattern = String.Format(@"(?<!_){0}", Regex.Escape(shorthandValue))