用正则表达式替换字符串中的项的特定实例

时间:2018-05-05 13:56:42

标签: c# regex

我正在尝试构建一个将替换字符串的特定实例的解析器。所以例如我有一个sn+sn+sn*9的字符串,我想只替换sn的第三个实例我怎样才能用正则表达式做这个?

我试过了

var expression = "sn+sn+sn*9";
var regex = new Regex("sn");
expression = regex.Replace("sn",4.ToString());
//expression = regex.Replace("sn",4.ToString(),1,2);

提前致谢

3 个答案:

答案 0 :(得分:2)

int x = 0;
string repl = "ANYTHING";
string s = Regex.Replace("sn+sn+sn*9", "sn", m => (++x) == 3 ? repl : m.Value);

<强>解释

x变量用于跟踪搜索文本的出现次数。一旦Regex发现第三次出现,MatchEvaluator委托就用repl变量中的任何内容替换该字符串。否则,它只返回相同的找到的字符串。

答案 1 :(得分:1)

这是一个选项,它使用以下正则表达式模式:

(?<=.*?\bsn\b.*?\bsn\b.*?)\bsn\b

当我们之前在字符串中看到过两个sn字词时,这种模式确实将sn替换为单个字词。我在下面的示例代码中使用替换blah,但您可以使用任何您想要的值。

var term = @"sn";
var replacement = "blah";
var expression = term + "+" + term + "+" + term + "*9";
var pattern = @"(?<=.*?\b" + term + @"\b.*?\b" + term + @"\b.*?)\b" + term + @"\b";
var exp_trim = Regex.Replace(expression, @pattern, replacement);
Console.WriteLine(exp_trim);

sn+sn+blah*9

Demo

答案 2 :(得分:1)

这是另一种使用匹配的索引和长度的方法

           string expression = "sn+sn+sn*9";
            Regex regex = new Regex("sn");
            MatchCollection matches = regex.Matches(expression);
            expression = expression.Substring(0, matches[2].Index) + "4".ToString() + expression.Substring(matches[2].Index + matches[2].Length);