2010-06-09 3 views
1

임의의 문자열 (즉, 외부 컨트롤)을 CLS 규격으로 변환하기 위해 호출 할 수있는 알고리즘 (또는 외부 라이브러리)을 아는 사람이 있습니까?임의의 문자열을 CLS 준수 이름으로 변환하려면 어떻게해야합니까?

ASP.Net 보고서 뷰어 컨트롤에 대한 동적 RDLC (클라이언트 보고서 정의)를 생성 중이며 일부 필드 이름은 사용자가 입력 한 문자열을 기반으로해야합니다.

불행히도 (제 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/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

좋은 정보! 정규식이 할 수없는 것은 무엇입니까? –

+1

CLS 규격 이름에는 밑줄 문자가 허용되지 않습니다. http://stackoverflow.com/a/1195061/1086134를 참조하십시오. 또한 위의 알고리즘을 문자열 모음에 적용하면 고유하지 않은 이름 집합이 생길 수 있습니다. –

+0

@ Martins_ATS 당신이 옳습니다. 고유 한 이름 집합을 얻는 방법? 이름에 'Guid.NewGuid(). ToString()'으로 런타임에 생성 된 GUID 문자열을 추가하면 해결되지만 이름이 너무 길어서 어떤 경우에는 실용적이지 않습니다. –

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 
    } 
}