2008-08-07 6 views
15

C#에서 텔넷 클라이언트를 작성 중이며 구문 분석해야 할 부분은 ANSI/VT100 이스케이프 시퀀스입니다. 구체적으로 색상 및 형식 지정에 사용되는 것 (here)입니다. 내가 가진왜이 정규 표현식이 더 빠릅니까?

한 가지 방법은 하나를 모든 코드를 찾아 제거하는 것입니다, 그래서 필요하다면 나는 서식없이 텍스트를 렌더링 할 수있다 : 나는 정규 표현식에 새로운 해요

 
public static string StripStringFormating(string formattedString) 
{ 
    if (rTest.IsMatch(formattedString)) 
     return rTest.Replace(formattedString, string.Empty); 
    else 
     return formattedString; 
} 

및 I가 제안되었다

static Regex rText = new Regex(@"\e\[[\d;]+m", RegexOptions.Compiled);

그러나 서버에서 오류로 인해 이스케이프 코드가 불완전한 경우이 작업은 실패합니다. 그럼이 제안했지만, 내 친구가 느려질 수 있습니다 경고 (이 또 다른 조건 나중에 건너 수 (Z)과 일치) :

static Regex rTest = 
       new Regex(@"(\e(\[([\d;]*[mz]?))?)?", RegexOptions.Compiled);

이뿐만 아니라 작동했지만 속도에 사실이었다 내 텍스트 렌더링에 대한 영향을 줄였습니다. 누군가가 정규 표현식 초보자에게 설명 할 수 있습니까? :)

답변

1

자세한 분석을 수행하지 않고도 물음표 때문에 더 빠름을 알 수 있습니다. 이것들은 정규 표현식이 "게으르다"는 것을 허용하고, 입력의 나머지 부분이 일치하는지 검사하는 것보다는 일치 할 수있을만큼 빨리 종료합니다.

대부분이 질문에 * 또는 +를 적용하기 때문에이 답변에 만족하지 않습니다. 내가 입력에 더 익숙하다면, 그것은 나에게 더 이해할 수 있습니다.

(+ 또한, 코드 서식, 당신이 당신의 모든 코드를 선택하고 를 누르면 Ctrl 키 K는 필요한 네 개의 공백을 추가해야합니다.)

3

이유를 # 1이 느린 이유 그 [\ d;] + 욕심 많은 수량입니다. +를 사용합니까? 또는 *? 게으른 양자화를 할 것입니다. 자세한 내용은 MSDN - Quantifiers을 참조하십시오.

당신은 시도 할 수 있습니다 : 당신을 위해 더 빠를 수 있습니다

"(\e\[(\d{1,2};)*?[mz]?)?" 

합니다.

3

정말 regexp를 두 번 실행 하시겠습니까? 확인하지 않고 (나쁜 나) 나는 이것이 잘 작동 것이라고 생각했을 것이다 : 만약 그렇다면

public static string StripStringFormating(string formattedString) 
{  
    return rTest.Replace(formattedString, string.Empty); 
} 

는, 당신이 ~ 배 빠른 실행 볼 수 ...

+0

는 먼저 검사를 실행하는 것과 동일 그것이 완전히 일치하는지보십시오. 당신은 같은 결과를 얻습니다! – Nidonocu

1

내가 잘 모르겠어요 이것은 당신이 작업하고있는 것에 도움이 될 것이다. 그러나 오래전에 ANSI 그래픽 파일을 파싱하기위한 정규식을 작성했다.

(?s)(?:\e\[(?:(\d+);?)*([A-Za-z])(.*?))(?=\e\[|\z) 

각 코드와 이에 연결된 텍스트가 반환됩니다.

입력 문자열 :

<ESC>[1;32mThis is bright green.<ESC>[0m This is the default color. 

결과 : 없음 일치와 줄에 정규 표현식을 실행, 이해가 않습니다 지금은 그것에 대해 생각

[ [1, 32], m, This is bright green.] 
[0, m, This is the default color.] 
+0

답장을 보내 주셔서 감사합니다. 의심의 여지없이 나중에 코드를 검토하여 개선 가능성을 검토 할 때이 표현을 계속 사용하겠습니다. :) 제가 발견 한 것처럼, '더 큰'정규 표현식은 작은 것들보다 빠른 경향이 있습니다. – Nidonocu

+0

.NET에서 ANSI 코드로 수행중인 작업에 관심이 있습니다. 현재 .NET보다는 레일로 사이트를 재실행하고 있지만 ANSI를 .NET에서 어떻게 해석 할 수 있는지 궁금합니다. – lordscarlet