2011-08-12 4 views

답변

23

모든 제어 문자와 일치 \p{Cc} 패턴은, 그래서

Regex.Replace(input, 
       @"\p{Cc}", 
       a=>string.Format("[{0:X2}]", (byte)a.Value[0]) 
      ); 

는 제어 문자를 대체 할 것이다.

+0

좋은. 간단하고 따라하기 쉽다. – user380689

+0

"ABCD [09] \ x09 \ x05 \ r \ n"로 인해 "ABCD [09] [09] [05] [0D] [0A] ". 당신은 여는 중괄호 (일반적으로 "[["를 사용하여 나의 예가 "ABCD [[09] [05] [0D] [0A]"가 될 수 있도록)를 사용하고 싶습니다. –

8
string s = "ABCD\x09\x05\r\n"; 
var replace = 
    s.Select(c => Char.IsControl(c) ? ((int)c).ToString("X2") : c.ToString()) 
    .Aggregate(new StringBuilder(), (sb, t) => sb.Append(t)) 
    .ToString(); 

죄송합니다. 편리한 컴파일러는 아닙니다.하지만이 컴파일 작업을 수행합니다.

또한이 종류의 문자열은 두 번씩 (각 문자를 16 진수 대체 또는 문자열로 투영 한 다음 다시 집계하기 위해 한 번 훑습니다.) Enumerable.Aggregate에 대한 호출에 투영법을 일괄 적으로 적용하여이를 피할 수 있지만 이것은 더 명확하고 이것이 성능에 중요하지 않는 한 그다지 중요하지는 않습니다.

+0

Aghh. 몇 분이면 나를 이길 수 있습니다. LINQPad를 통한 작업 확인. –

+1

아, 고맙습니다. 불분명 한 버전을 봐야합니다. –

+0

+1; 훌륭한 예제 코드. 이제는'Aggregate'에 대한 사용법을 찾기위한 발판을 마련했습니다. select 함수를 개인적으로 로컬 대리자로 푸시합니다. 가독성을 위해. –

4

Jason의 예에서 영감을 받았지만 조금 더 간단합니다. 더 나은 수행하는 확실하지 않다, 그리고 지금 당장 벤치 마크 시간이 없어,하지만 그것은 단지 한 번에 모든 것을 수행해야합니다

string s = "ABCD\x09\x05\r\n"; 
string replace = String.Concat(s.Select(c => Char.IsControl(c) ? 
              String.Format("[{0:X2}]", (int)c) : 
              c.ToString())); 

나는 기능이 테스트했습니다.

관련 문제