Basically something like:
const string start = @"(\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl})";
const string extend = @"(\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf})";
Regex ident = new Regex(string.Format("{0}({0}|{1})*", start, extend));
s = s.Normalize();
return ident.IsMatch(s);
Да:
// using System.CodeDom.Compiler;
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
if (provider.IsValidIdentifier (YOUR_VARIABLE_NAME)) {
// Valid
} else {
// Not valid
}
Отсюда: Как определить, является ли строка допустимым именем переменной?
Я бы с осторожностью относился к другим предлагаемым здесь решениям. Для вызова CodeDomProvider.CreateProvider требуется найти и проанализировать файл Machine.Config, а также файл app.config. Это, вероятно, будет в несколько раз медленнее, чем время, необходимое для того, чтобы просто проверить строку самостоятельно.
Вместо этого я бы рекомендовал вам внести одно из следующих изменений:
Кэшируйте поставщика в статической переменной.
Это приведет к тому, что вы создадите его только один раз, но это замедлит загрузку типа.
Создайте поставщика напрямую, создав Microsoft.CSharp .CSharpCodeProvider instance your self
При этом будет пропущен анализ файла конфигурации.
Напишите код для реализации проверки самостоятельно.
Если вы сделаете это, вы получите максимальный контроль над тем, как это будет реализовано, что может помочь вам оптимизировать производительность, если вам нужно. Полную лексическую грамматику идентификаторов C # см. В разделе 2.2.4 спецификации языка C # .
Это можно сделать с помощью отражения - см. Как определить, является ли строка допустимым именем переменной ?