Как я могу преобразовать произвольные строки на имена, соответствующие CLS?
-
26-09-2019 - |
Вопрос
Кто-нибудь знает об алгоритме (или внешней библиотеке), которую я мог бы позвонить, чтобы преобразовать произвольную строку (то есть вне моего контроля), чтобы быть совместимым?
Я генерирую динамический RDLC (определение клиентского отчета) для контроля просмотра просмотра отчетов ASP.NET, а некоторые имена полевых полей должны быть основаны на строках, введенных пользователем.
К сожалению, я мало контролирую запись имени поля клиентом (через 3-я сторонняя 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/Revized-dynamic-rdlc-generation.html.
Решение
Вот алгоритм, который я использую для создания идентификаторов 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);
}
Ведущий подчеркивает не нужно, если первый персонаж результата Regex не является числовым.
Другие советы
Вот нашел регулярное выражение, которое я нашел, могло быть полезен для разделения 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
}
}