C# 清理属性名称的字符串

C# 清理属性名称的字符串,c#,regex,string,sanitization,C#,Regex,String,Sanitization,问题 我需要清理从用户输入到有效属性名的字符串集合 上下文 我们有一个与运行时生成的类一起工作的DataGrid。这些类是基于一些参数生成的。参数名称将转换为属性。其中一些参数名来自用户输入。我们实现了这一点,一切似乎都很好。我们清理字符串的逻辑是只允许数字和字母,并将其余的转换为X const string regexPattern = @"[^a-zA-Z0-9]"; return ("X" + Regex.Replace(input, regexPa

问题

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

上下文

我们有一个与运行时生成的类一起工作的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、bc等,但我更希望该名称在调试中仍然可以识别。当然,除非实现这种行为太复杂了

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


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

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

在c#
是成员名称的有效符号。将所有无效符号(
chr
)替换为
+(短)chr+”
,而不是替换为
X

印刷品

Parameter_32_Name
Parameter_95_Name

如果存在三个字符串,例如“Parameter Name”、“Parameter\u Name”和“Parameter!Name”,则输出应该是parametername ParameterBName ParameterCNametry this
[^a-zA-Z0-9]
。注意空格和下划线。如果可以存储值对(参数名称、用户输入),请发表意见。是否可以在生成的参数名称末尾附加该名称的出现次数?(在参数名生成时)例如,参数名->
ParameterXName0
parameter\u name->
ParameterXName1
正是我要找的,效果很好!也不知道DotNetFiddle。对这类事情非常有用。@MartijnvandenH,很好!仅用数字在属性名称上测试它(例如“123”,nov在c#中有效),并确定您想要如何处理它们不是
Char.IsLetter
不仅仅是
[A-Za-z]
?@eugenerayabtsev,
Char.IsLetter
不仅仅是
[A-Za-z]
。c#还允许名称使用非拉丁符号
Parameter_32_Name
Parameter_95_Name