清理 属性 名称的字符串
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+"_"
.
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
问题
我需要将用户输入的字符串集合清理为有效的 属性 名称。
上下文
我们有一个与生成的运行时一起工作的 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+"_"
.
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