我正在尝试使用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);
}
答案 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个字符。正则表达式只匹配非临时表名。