c#RegEx-仅由一个字符分隔的术语的多次替换

c#RegEx-仅由一个字符分隔的术语的多次替换,c#,regex,C#,Regex,我正在尝试替换字符串,但挑战是如果字符串是另一个单词的一部分,我不想替换它。目标字符串可以由字母、数字和句点组成。例如,如果目标字符串为“Old1.Var”,替换为“newVar”,那么我希望在字符串看起来像“This is a Old1.Var”时进行替换,而不是在“This is a Old1.Variable时进行替换。目标字符串(即变量)可以在字符串中出现多次,每次都需要替换。目标字符串可以位于字符串的开头、中间或结尾 我能想到的最接近正则表达式是: (^\w\d.])Old1.Var(

我正在尝试替换字符串,但挑战是如果字符串是另一个单词的一部分,我不想替换它。目标字符串可以由字母、数字和句点组成。例如,如果目标字符串为“Old1.Var”,替换为“newVar”,那么我希望在字符串看起来像“This is a Old1.Var”时进行替换,而不是在“This is a Old1.Variable时进行替换。目标字符串(即变量)可以在字符串中出现多次,每次都需要替换。目标字符串可以位于字符串的开头、中间或结尾

我能想到的最接近正则表达式是: (^\w\d.])Old1.Var([^\w\d.]|$)。这会处理我所有的测试用例,除了只有一个字符分隔两个连续的目标项

但是,由于匹配的工作方式,如果术语之间只有一个字符,这就不起作用。换句话说,“Old1.Var+Old1.Var”只匹配第一项,而不替换第二项。如果我在+的周围加上空格,那么这是正确的,但术语之间没有一个字符

我的测试用例如下(下面的每一行都是一个单独的用例):

预期结果如下:

newVar,xxxx,newVar,xxxx,newVar
EmbededOld1.Var,xxxx,EmbededOld1.Var,xxxx,EmbededOld1.Var
Old1.VarEmbeded,xxxx,Old1.VarEmbeded,xxxx,Old1.VarEmbeded
newVar@newVar+(newVar/newVar*newVar)-newVar
var resultStr = Regex.Replace(variableString, @"(^|[^\w\d.])" + oldVariableName + @"([^\w\d.]|$)", "$1" + newVariableName + "$2", RegexOptions.IgnoreCase);
作为参考,我使用的C代码如下:

newVar,xxxx,newVar,xxxx,newVar
EmbededOld1.Var,xxxx,EmbededOld1.Var,xxxx,EmbededOld1.Var
Old1.VarEmbeded,xxxx,Old1.VarEmbeded,xxxx,Old1.VarEmbeded
newVar@newVar+(newVar/newVar*newVar)-newVar
var resultStr = Regex.Replace(variableString, @"(^|[^\w\d.])" + oldVariableName + @"([^\w\d.]|$)", "$1" + newVariableName + "$2", RegexOptions.IgnoreCase);

您需要将单词边界与lookarounds或lookarounds一起使用:

var resultStr = Regex.Replace(variableString, 
        @"(?<![\w.])" + Regex.Escape(oldVariableName) + @"(?![\w.])", 
        newVariableName.Replace("$", "$$"), 
        RegexOptions.IgnoreCase
);
var resultStr=Regex.Replace(variableString,

@“(?感谢您的详细解释和演示。我还缺少了其他测试用例可能会出现问题的那些额外元素(转义和替换)。我使用的是regex101.com,而.NET中的行为略有不同,因此您对regexstorm.NET的引用也有帮助。