【问题标题】:Sanitizing a String for a Property Name清理属性名称的字符串
【发布时间】:2015-12-26 14:17:07
【问题描述】:

问题

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

上下文

我们有一个与运行时生成的类一起使用的 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

属性名称总是正确的,我们将原始字符串存储在字典中,因此我们仍然可以显示用户友好的参数名称。

然而,问题开始的地方是当一个字符串只有这样的非法字符不同时:

参数名称

参数名称

这些都被转换成:

参数X名称

一种解决方案是只生成一些安全的、不相关的名称,例如 A、B C 等。但我希望该名称在调试中仍可识别。当然,除非实现这种行为太复杂。

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

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

【问题讨论】:

  • 如果存在三个字符串,如“参数名称”、“参数名称”和“参数!名称”输出应该是 ParameterAName ParameterBName ParameterCName
  • 试试这个[^a-zA-Z0-9 _]。注意空格和下划线。如果可行,请发表评论
  • 您可以存储值对(参数名称,用户输入)
  • 是否可以在生成的参数名称末尾附加该名称的出现次数? (在参数名称生成时)例如 Parameter Name -> ParameterXName0 Parameter_Name -> ParameterXName1

标签: c# regex string sanitization


【解决方案1】:

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

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

【讨论】:

  • 正是我想要的,效果很好!也不知道 DotNetFiddle。对这类事情非常有用。
  • @MartijnvandenH,很好!仅用数字对属性名称进行测试(例如“123”,在 c# 中有效)并决定如何处理它们
  • Char.IsLetter不只是[A-Za-z]吗?
  • @EugeneRyabtsev,Char.IsLetter 不仅仅是[A-Za-z]。而且 c# 还允许名称使用非拉丁符号
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 2011-04-12
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2011-09-30
相关资源
最近更新 更多