用于验证SQL Server中的表名的正则表达式(数据库兼容级别120)

时间:2015-06-08 08:46:22

标签: c# sql sql-server regex

我正在尝试使用this Stack Overflow answer验证表/列名称,但它无效。

对于ValidateTableName("18_18_mapped"),它会返回false。但对于ValidateTableName("mappingStorage_f9dc07dbca414e2d86db00114a9104a3") - 它会返回true

有关验证表/列名称的任何输入都会有所帮助。

static void Main(string[] args)
{
    bool temp = ValidateTableName("18_18_mapped"); // Returns false
    ...
}

private static bool ValidateTableName(string tableName)
{
    string regexForTableName = @"^[\p{L}_][\p{L}\p{N}@$#_]{0,127}$";
    return Regex.IsMatch("[" + tableName + "]", regexForTableName);
}   

1 个答案:

答案 0 :(得分:5)

不要添加方括号:

return Regex.IsMatch(tableName, regexForTableName);

模式中的括号是表示字符类所必需的。这些不是文字方括号。

另外,我在方法之外声明/编译正则表达式以提高效率:

private static readonly Regex regexForTableName = new Regex(@"^[\p{L}_][\p{L}\p{N}@$#_]{0,127}$");

private static bool ValidateTableName(string tableName)
{
    return regexForTableName.IsMatch(tableName);
}   

修改

根据MSDN,这些是specifications for database identifiers。我找不到任何规格说明第一个字符可以是数字。但是,如果您需要允许,请添加\p{N}模式:

^(?:[\p{N}\p{L}_][\p{L}\p{N}@$#_]{0,127}|\[.{1,126}\])$

我正在添加\[.{1,126}\]以支持[]中包含的所有名称,并且它们的长度必须为128个字符。正则表达式只匹配非临时表名。