正则表达式替换用短划线包围的一个字母

时间:2016-01-28 10:34:29

标签: c# regex

我尝试用另一个字母替换一个或两个破折号包围的特定字母

实施例: modif-i-ed =>修改(-i-替换为y)

a-im => eim(a-替换为e)

我试过

Regex.Replace(word, "-?([a-zA-Z])-", new_letter)

但它为第一个例子生成例如modiyyed

1 个答案:

答案 0 :(得分:3)

问题是,一旦第一个-成为可选项,modif-i-ed内就会有两个匹配项:f-i-。因此,有两个替代品。

我建议在-X-模式之前匹配并捕获字母,然后按照匹配评估程序返回它们,并使用-?[a-z]-匹配然后替换:

(\B[a-z](?=-))|-?[a-z]-

C#:

var myLetter = "y";
var str = " modif-i-ed  a-im  y-i-eld";
var res = Regex.Replace(str, @"(\B[a-z](?=-))|-?[a-z]-",
      m => m.Groups[1].Success ? m.Groups[1].Value : myLetter);
Console.WriteLine(res); // => modifyed  yim  yyeld

请参阅IDEONE demo