Как я могу преобразовать произвольные строки в CLS-совместимые имена? - PullRequest
1 голос
/ 10 июня 2010

Кто-нибудь знает алгоритм (или внешнюю библиотеку), который я мог бы вызвать для преобразования произвольной строки (т.е. вне моего контроля) в CLS-совместимость?

Я генерирую динамический RDLC (Определение отчета клиента)) для элемента управления ASP.Net Report Viewer, а некоторые имена полей должны основываться на строках, введенных пользователем.

К сожалению, у меня мало контроля над вводом имен полей клиентом (черезСторонняя CMS).Но я достаточно гибок в отношении подстановок, необходимых для создания совместимой строки.

Пока у меня есть алгоритм реактивного взлома:

public static string FormatForDynamicRdlc(this string s)
{
    //We need to change this string to be CLS compliant.
    return s.Replace(Environment.NewLine, string.Empty)
        .Replace("\t", string.Empty)
        .Replace(",", string.Empty)
        .Replace("-", "_")
        .Replace(" ", "_");
}

Но я бы хотел что-то более всеобъемлющее.Любые идеи?

ПРИМЕЧАНИЕ: Если это поможет, алгоритм, который я использую для создания динамического RDLC, основан на методе BuildRDLC, найденном здесь: http://csharpshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generation.html

Ответы [ 2 ]

4 голосов
/ 10 июня 2010

Вот алгоритм, который я использую для создания идентификаторов C / C ++ из произвольных строк (в переводе на C #):

    static void Main(string[] args)
    {
        string input = "9\ttotally no @ # way!!!!";
        string safe = string.Concat("_", Regex.Replace(input, "[^a-z0-9_]+", "_"));
        Console.WriteLine(safe);
    }

Начальное подчеркивание не требуется, если первый символ результата регулярного выражения не числовой.

0 голосов
/ 29 ноября 2016

Вот регулярное выражение, которое я нашел полезным для разделения CLS-совместимой части строки и не CLS-совместимой части строки. Ниже реализация в C #:

string strRegex = @"^(?<nonCLSCompliantPart>[^A-Za-z]*)(?<CLSCompliantPart>.*)";
Regex myRegex = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
string strTargetString = @"                            _aaaaaa[5]RoundingHeader";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
...