c# - 清理属性名称的字符串

标签 c# regex string sanitization

问题

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

上下文

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

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

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

最佳答案

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

在 c# 中,_ 是成员名称的有效符号。不是用 X 而是用 "_"+(short)chr+"_" 替换所有无效符号 (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

关于c# - 清理属性名称的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32838239/

相关文章:

php - 正则表达式计算不同排列的数量

.net - 理解 C++ .Net 中的 String^

javascript - 通过字符串路径访问和修改 JSON-Object

regex - 在 R 中计算 strsplit 的输出

c# - 如何制作一个文本框,可以限制用户只能写入从0000到FFFF的输入。 C#

c# - 如何抑制 Visual Studio 2017 (C#) 中的初始生成后事件错误?

regex - 使用网址重写将www添加到网址

C# 正则表达式模式帮助

c# - 在 .net 中将 XML 包装在 SOAP 信封中

c# - 使用 IIS 中托管的 WCF 处理长时间运行的服务操作的正确方法是什么?