如何使用regex替换匹配项,仅当它前面没有给定字符时

本文关键字:前面 字符 替换 regex 何使用 | 更新日期: 2023-09-27 17:53:49

我有一个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"被替换,我最终得到这样的结果:

"This is valueoftheshorthand ."

为什么空格被删除?

再次更新

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

如何使用regex替换匹配项,仅当它前面没有给定字符时

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

您正在忽略返回的字符串。

您的正则表达式看起来是正确的,如果您修复了代码以实际保存字符串(提示@jameskyburz),那么您仍然应该确保将shorthandValue视为文字。使用Regex.Escape:

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