为属性名清理字符串

4

问题

我需要对用户输入的一组字符串进行清理,以使其成为有效的属性名称。

背景

我们有一个 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等。但我更喜欢名称在调试时仍然能够被识别。除非实现这种行为过于复杂,否则我会更倾向于这个方案。

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

我觉得我正在重新发明轮子。有没有标准解决方案或技巧来解决这个问题?


如果存在三个字符串,分别为“Parameter Name”、“Parameter_Name”和“Parameter!Name”,则输出应为ParameterAName、ParameterBName和ParameterCName。 - amit dayama
请尝试使用此正则表达式:[^a-zA-Z0-9 _]。请注意空格和下划线,并在测试后留下评论以确认其是否有效。 - james jelo4kul
你可以存储键值对(参数名称,用户输入)。 - Mariano
在生成参数名称时,在名称末尾附加该名称出现次数的数字,这样做是否可以?例如Parameter Name -> ParameterXName0 Parameter_Name -> ParameterXName1 - Matteo Umili
1个回答

7

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

在C#中,_是成员名称的有效符号。将所有无效符号(chr)替换为"_"+(short)chr+"_"而不是X

演示

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

正是我所需要的,运行得很好!我之前也不知道DotNetFiddle。这对这些事情非常有用。 - Martijn
@MartijnvandenH,好的!请在仅包含数字的属性名称上进行测试(例如“123”,在C#中无效),并决定您想要如何处理它们。 - ASh
Char.IsLetter 不仅仅是 [A-Za-z] 吗? - Eugene Ryabtsev
@EugeneRyabtsev,“Char.IsLetter”不仅仅是“[A-Za-z]”。而且C#也允许在名称中使用非拉丁符号。 - ASh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接