2015-08-06 2 views
1

Я хочу изменить текст, содержащий числа. Первый и последний символы чисел должны оставаться, остальные должны быть заменены на *. Номера, смешанные с текстом, должны оставаться неизменными.Маскировка чисел в строке

У меня есть этот код:

string result = Regex.Replace(input, @"(?<=[\d]{1})[\d]*(?=[\d]{1})", 
           m => new string('*', m.Length)); 

Что с этим входом:

"Lorem 1 ip234sum 22 dolor 3234445 sit amet, adipiscing 1234" 

Если показать этот результат:

"Lorem 1 ip234sum 22 dolor 3*****5 sit amet, adipiscing 1**4" 

Однако, токовый выход:

"Lorem 1 ip2*4sum 22 dolor 3*****5 sit amet, adipiscing 1**4" 

Как вы видите, это неправильно и работает на ip234sum. Как я могу заставить его игнорировать части строки, которые не являются полностью числовыми?

ответ

5

Добавление \b якоря ваш взгляд обходные будет решить эту проблему: (? <= \ Ь \ d)

string result = Regex.Replace(input, @"(?<=\b[\d]{1})[\d]*(?=[\d]{1}\b)", m => new string('*', m.Length)); 
//           ^^      ^^ 

Demo.

+4

Параметр '\ d + (? = \ D \ б)' regex намного чище. –

+0

@stribizhev Это абсолютно верно. Тем не менее, я хотел сохранить неизменное выражение OP, потому что он был настолько близок к правильному решению. У него могут быть причины оставить '{1}': возможно, ему нужна была возможность изменить количество «видимых» символов - скажем, по две с каждой стороны. – dasblinkenlight