我正在尝试构建一个将替换字符串的特定实例的解析器。所以例如我有一个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);
提前致谢
答案 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
答案 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);