2015-09-29 2 views
3

ПроблемыСанобработка строки для имени свойства

Мне нужно дезинфицировать набор строк из пользовательского ввода действительного имени свойства.

Контекст

У нас есть DataGrid, который работает с во время выполнения сгенерированных классов. Эти классы генерируются на основе некоторых параметров. Имена параметров преобразуются в свойства. Некоторые из этих имен параметров относятся к пользовательскому вводу. Мы реализовали это, и все это, казалось, отлично работало. Наша логика дезинфицировать строки была разрешить только цифру и букву и преобразовать остальные к X.

const string regexPattern = @"[^a-zA-Z0-9]"; 
return ("X" + Regex.Replace(input, regexPattern, "X")); //prefix with X in case the name starts with a number 

Имена свойств всегда были правильными, и мы сохранили исходную строку в словаре, чтобы мы могли еще показать дружественный к пользователю имя параметра.

Однако там, где начинаются проблемы, когда строка отличается только недопустимыми символами, как это:

Имя параметра

ИМЯ_ПАРАМЕТР

Они оба были преобразованы в:

ПараметрXName

Решение будет состоять в том, чтобы просто создать некоторые безопасные, несвязанные имена, такие как A, B C. и т. Д. Но я бы предпочел, чтобы имя все еще было распознано при отладке. Если это слишком сложно для реализации этого поведения, конечно.

Я смотрел другие вопросы по StackOverflow, но все они, кажется, удаляют незаконные символы, которые имеют ту же проблему.

Мне кажется, что я изобретаю колесо. Есть ли какое-то стандартное решение или трюк для этого?

+0

вы хотите что-то вроде, если существует три строки, как "Параметр Name" " Parameter_Name "и" Parameter! Name " вывод должен быть ParameterAName ParameterBName ParameterCName –

+0

попробуйте этот '[^ a-zA-Z0-9 _]'. обратите внимание на пространство и подчеркивание. любезно комментарий, если он работает –

+0

Вы можете сохранить пару значений (имя параметра, ввод пользователя) – Mariano

ответ

3

я могу предложить, чтобы изменить алгоритм генерации безопасным, не связанный между собой и узнаваемые

в C# _ является действительным символом для имен членов. Заменить все недопустимые символы (chr) не с X но

"_"+(short)chr+"_"

demo

public class Program 
{ 
    public static void Main() 
    { 
     string [] props = {"Parameter Name", "Parameter_Name"}; 

     var validNames = props.Select(s=>Sanitize(s)).ToList(); 
     Console.WriteLine(String.Join(Environment.NewLine, validNames)); 
    } 

    private static string Sanitize(string s) 
    { 
     return String.Join("", s.AsEnumerable() 
           .Select(chr => Char.IsLetter(chr) || Char.IsDigit(chr) 
               ? chr.ToString()  // valid symbol 
               : "_"+(short)chr+"_") // numeric code for invalid symbol 
         ); 
    } 
} 

печатает

Parameter_32_Name 
Parameter_95_Name 
+0

Именно то, что я искал, отлично работает! Также не знал о DotNetFiddle. Очень полезно для такого рода вещей. – Martijn

+0

@MartijnvandenH, штраф! проверить его на имя свойства только с цифрами (например, «123», нов, действительный в C#) и решить, как вы хотите их обрабатывать – ASh

Смежные вопросы