清理属性名称的字符串

时间:2015-09-29 07:33:37

标签: c# regex string sanitization

问题

我需要清理从用户输入到有效属性名称的字符串集合。

上下文

我们有一个与运行时生成的类一起使用的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

属性名称始终是正确的,我们将原始字符串存储在字典中,因此我们仍然可以显示用户友好的参数名称。

然而,麻烦开始的地方是一个字符串只有非法字符不同,如下所示:

  

参数名称

     

PARAMETER_NAME

这些都被转换为:

  

ParameterXName

解决方案是生成一些安全,无关的名称,如A,B C.等。但我更喜欢在调试中仍然可以识别该名称。当然,除非它太复杂而无法实现这种行为。

我查看了StackOverflow上的其他问题,但它们似乎都删除了非法字符,这也有同样的问题。

我觉得我正在重新发明轮子。是否有一些标准的解决方案或技巧?

1 个答案:

答案 0 :(得分:4)

我可以建议改变生成安全,无关和可识别名称的算法

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