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

时间:2017-06-09 18:13:29

标签: c# regex

我正在尝试进行字符串替换,但挑战是我不想替换字符串,如果它是另一个字的一部分。目标字符串可以包含字母,数字和句点。因此,例如,如果目标字符串是“Old1.Var”并且替换是“newVar”,那么当字符串看起来像“This is a Old1.Var”时我想要替换,但不是当它是“This是Old1.Var iable “。目标字符串(即变量)可以在字符串内多次出现,并且每个字符串都需要被替换。目标字符串可以位于字符串的开头,中间或末尾。

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

但由于匹配的工作方式,如果术语之间只有一个字符,则不起作用。换句话说,“Old1.Var + Old1.Var”在第一个术语上匹配,并不替换第二个术语。如果我在+周围放置空格,那么这可以正常工作,但不能在术语之间使用单个字符。

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

Old1.Var,xxxx,Old1.Var,xxxx,Old1.Var
EmbededOld1.Var,xxxx,EmbededOld1.Var,xxxx,EmbededOld1.Var
Old1.VarEmbeded,xxxx,Old1.VarEmbeded,xxxx,Old1.VarEmbeded
Old1.Var@Old1.Var+(Old1.Var/Old1.Var*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

作为参考,我正在使用的C#代码如下:

var resultStr = Regex.Replace(variableString, @"(^|[^\w\d.])" + oldVariableName + @"([^\w\d.]|$)", "$1" + newVariableName + "$2", RegexOptions.IgnoreCase);

1 个答案:

答案 0 :(得分:1)

你需要使用带有外观的单词边界,或者只是看一下:

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

下面,

  • @"(?<![\w.])" - 如果在当前位置之前有单词char或.,则会导致匹配失败的负面反馈
  • Regex.Escape(oldVariableName) - 值是文字字符串,因此必须转义所有特殊字符
  • @"(?![\w.])" - 如果在当前位置之后有一个字词char或.,则会导致匹配失败的否定前瞻。
  • newVariableName.Replace("$", "$$") - 此处$中的所有newVariableName都加倍,因为$后跟数字形成反向引用,但必须处理newVariableName作为文字字符串。

请参阅.NET regex demoenter image description here