regex - 특수문자 - 정규표현식 테스트




이 정규식이 더 빠른 이유는 무엇입니까? (3)

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

시도해보십시오 :

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

그것은 당신을 위해 더 빠를 수 있습니다.

저는 C #에서 Telnet 클라이언트를 작성하고 있으며, 구문 분석해야하는 부분은 ANSI / VT100 이스케이프 시퀀스 (특히 색상 및 형식 지정에 사용되는 시퀀스)입니다 ( 여기에서 자세히 설명 함).

내가 가진 한 가지 방법은 모든 코드를 찾아서 제거하는 것이므로 필요한 경우 서식을 지정하지 않고 텍스트를 렌더링 할 수 있습니다.

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

나는 정규 표현식에 익숙하지 않고 이것을 사용할 것을 제안 받았다.

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

그러나 서버의 오류로 인해 이스케이프 코드가 불완전한 경우이 작업이 실패했습니다. 그래서 이것은 제안되었지만, 제 친구는 더 느릴지도 모른다고 경고했습니다 (이것은 나중에 또 다룰 다른 조건 (z)와 일치합니다) :

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

이것은 효과적 일뿐만 아니라 실제로 텍스트 렌더링에 미치는 영향을 줄이거 나 줄일 수있었습니다. 누군가가 정규 표현식 초보자에게 설명 할 수 있습니까? :)


regexp를 두 번 실행하고 싶습니까? 체크하지 않고서는 (나쁜 것) 나는 이것이 잘 작동 할 것이라고 생각했을 것이다.

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

그렇다면 실행 속도가 두 배 빨라야합니다.


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

나는이 대답에 대해 전적으로 만족하지는 않습니다. 왜냐하면 이것은 주로 * 또는 + 다음에 물음표가 적용되기 때문입니다. 내가 입력에 더 익숙하다면, 그것은 나에게 더 이해할 수 있습니다.

또한 코드 서식을 지정하기 위해 모든 코드를 선택하고 Ctrl + K 를 눌러 필요한 네 개의 공백을 추가 할 수 있습니다.







ansi