2010-06-09 40 views
1

有誰知道一個算法(或外部庫),我可以調用將任意字符串(即在我的控制之外)轉換爲CLS兼容?如何將任意字符串轉換爲符合CLS的名稱?

我正在爲ASP.Net報表查看器控件生成動態RDLC(客戶端報表定義),並且某些字段名稱需要基於用戶輸入的字符串。

不幸的是,我很少控制客戶端輸入域名(通過第三方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

好的!什麼不能正則表達式:) – 2010-06-09 23:55:50

+1

我認爲不允許使用符合CLS的名稱的前導下劃線。請參閱http://stackoverflow.com/a/1195061/1086134。另外請注意,如果您將上述算法應用於字符串集合,最終可能會得到一組非唯一名稱。 – 2013-10-18 19:19:24

+0

@Martin_ATS你說得對。如何獲得一組獨特的名字?在'Guid.NewGuid()'運行時生成一個GUID字符串的名字,ToString()'解決了這個問題,但是在某些情況下,名字太長而不實用。 – 2016-11-25 16:34:22

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 
    } 
} 
相關問題