2016-01-28 3 views
3

Я пытаюсь заменить конкретное письмо, окруженное одним или двумя штрихами с другим письмомRegular Expression, чтобы заменить одну букву, окруженное черточек

Примеры: MODIF-и-е изд => modifyed (-i- является заменены у)

а-им => EIM (а- заменяется е)

Я попытался

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

Но для первого примера он генерирует, например, modiyyed.

+1

использовать это '- [a-zA-Z] -' –

+1

@ M.kazemAkhgary: Это не будет работать во втором примере. –

+0

@TimPietzcker oh .. да, я этого не заметил. –

ответ

3

Проблема в том, что после того, как первый - станет опциональным, есть 2 матча внутри 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

+1

Вам не нужен второй. –

+0

Я знаю, но это логично. Просто чтобы показать, что письмо должно быть целым словом. Я добавлю это к ответу. –

+1

Как я стараюсь в winforms C#, он не работает, он не меняет входное слово! – Ahmad