Есть ли метод в C#, чтобы проверить, является ли строка допустимым идентификатором [дубликат]

25
задан tshepang 1 November 2014 в 06:05
поделиться

4 ответа

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);
6
ответ дан 28 November 2019 в 18:23
поделиться

Да:

// using System.CodeDom.Compiler;
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
if (provider.IsValidIdentifier (YOUR_VARIABLE_NAME)) {
      // Valid
} else {
      // Not valid
}

Отсюда: Как определить, является ли строка допустимым именем переменной?

34
ответ дан 28 November 2019 в 18:23
поделиться

Я бы с осторожностью относился к другим предлагаемым здесь решениям. Для вызова CodeDomProvider.CreateProvider требуется найти и проанализировать файл Machine.Config, а также файл app.config. Это, вероятно, будет в несколько раз медленнее, чем время, необходимое для того, чтобы просто проверить строку самостоятельно.

Вместо этого я бы рекомендовал вам внести одно из следующих изменений:

  1. Кэшируйте поставщика в статической переменной.

    Это приведет к тому, что вы создадите его только один раз, но это замедлит загрузку типа.

  2. Создайте поставщика напрямую, создав Microsoft.CSharp .CSharpCodeProvider instance your self

    При этом будет пропущен анализ файла конфигурации.

  3. Напишите код для реализации проверки самостоятельно.

    Если вы сделаете это, вы получите максимальный контроль над тем, как это будет реализовано, что может помочь вам оптимизировать производительность, если вам нужно. Полную лексическую грамматику идентификаторов C # см. В разделе 2.2.4 спецификации языка C # .

8
ответ дан 28 November 2019 в 18:23
поделиться
1
ответ дан 28 November 2019 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: