Porque é que esta expressão regular mais rápido?

votos
15

Estou escrevendo um cliente Telnet de tipos em C # e parte do que eu tenho que analisar são seqüências / VT100 escape ANSI, especificamente, apenas os utilizados para a cor e formatação (detalhados aqui ).

Um método que eu tenho é de um para encontrar todos os códigos e removê-los, para que eu possa tornar o texto sem qualquer formatação, se necessário:

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

Eu sou novo para expressões regulares e eu estava sugeriu usar este:

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

No entanto, isso não se o código de escape foi incompleta devido a um erro no servidor. Assim, pois, este foi sugerido, mas o meu amigo advertiu que poderia ser mais lento (este também coincide com uma outra condição (z) que eu pode se deparar mais tarde):

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

Isto não só funcionou, mas era na verdade mais rápido e reduziu o impacto na minha renderização de texto. Alguém pode explicar a um novato regexp, por quê? :)

Publicado 07/08/2008 em 16:43
fonte usuário
Em outras línguas...                            


4 respostas

votos
3

Você realmente quer fazer executar o regexp duas vezes? Sem ter verificado (mau mim) Eu teria pensado que isso iria funcionar bem:

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

Se isso acontecer, você deve vê-lo correr ~ duas vezes mais rápido ...

Respondeu 09/09/2008 em 22:36
fonte usuário

votos
3

A razão por que # 1 é mais lento do que é [\ d;] + é um quantificador ávido. Usando +? ou *? vai fazer quantifing preguiçoso. Veja MSDN - Quantifiers para mais informações.

Você pode querer tentar:

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

Isso pode ser mais rápido para você.

Respondeu 07/08/2008 em 17:24
fonte usuário

votos
1

Eu não tenho certeza se isso vai ajudar com o que você está trabalhando, mas há muito tempo que eu escrevi uma expressão regular para analisar arquivos gráficos ANSI.

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

Ele irá retornar cada código eo texto associado a ele.

cadeia de entrada:

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

Resultados:

[ [1, 32], m, This is bright green.]
[0, m, This is the default color.]
Respondeu 17/09/2008 em 16:31
fonte usuário

votos
1

Sem fazer uma análise detalhada, eu acho que ele é mais rápido por causa dos pontos de interrogação. Estes permitem a expressão regular a ser "preguiçoso", e parar logo que eles têm o suficiente para igualar, ao invés de verificar se o resto da entrada corresponde.

Não estou inteiramente satisfeito com esta resposta, porém, porque isso se aplica principalmente para pontos de interrogação após * ou +. Se eu fosse mais familiarizados com a entrada, pode fazer mais sentido para mim.

(Além disso, para a formatação de código, você pode selecionar todo o seu código e pressione Ctrl+ Kpara tê-lo adicionar os quatro espaços necessários.)

Respondeu 07/08/2008 em 16:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more