问题
我需要清理从用户输入到有效属性名称的字符串集合。
上下文
我们有一个与运行时生成的类一起使用的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上的其他问题,但它们似乎都删除了非法字符,这也有同样的问题。
我觉得我正在重新发明轮子。是否有一些标准的解决方案或技巧?
答案 0 :(得分:4)
我可以建议改变生成安全,无关和可识别名称的算法
c#_
中的是成员名称的有效符号。将所有无效符号(chr
)替换为X
但
"_"+(short)chr+"_"
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