清理 属性 名称的字符串

Sanitizing a String for a Property Name

问题

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

上下文

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

Parameter_Name

这些都被转换成:

ParameterXName

一种解决方案是只生成一些安全的、不相关的名称,如 A、B C 等。但我更希望该名称在调试时仍可识别。当然,除非实现此行为太复杂。

我在Whosebug上看了其他的问题,好像都是去掉了非法字符,也有同样的问题。

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

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

在 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