2010-06-09 2 views
1

Кто-нибудь знает об алгоритме (или внешней библиотеке), который я мог бы вызвать, чтобы преобразовать произвольную строку (т. Е. Вне моего контроля) в соответствие с CLS?Как преобразовать произвольные строки в имена, совместимые с 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

ответ

4

Вот алгоритм я использую для создания 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

Nice one! Что не могут делать регулярные выражения :) –

+1

Я думаю, что подчеркивание под знаком CLS недопустимо. См. Http://stackoverflow.com/a/1195061/1086134. Также будьте осторожны, если вы примените вышеприведенный алгоритм к коллекции строк, вы можете получить неидеальный набор имен. –

+0

@Martin_ATS Вы правы. Как получить уникальный набор имен? Добавляя к имени строку GUID, сгенерированную во время выполнения с помощью Guid.NewGuid(). ToString() 'решает ее, но в некоторых случаях это имя слишком длинное, чтобы быть практичным. –

0

Вот регулярное выражение, которое я нашел, может быть полезно для разделения строковой части, совместимой с 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 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^