Pergunta sobre regex, string – Existem casos particulares em que a manipulação de texto nativo é mais desejável que o regex?

2

Existem casos particulares em que a manipulação de texto nativo é mais desejável que o regex? Em particular .net?

Nota: Regex parece ser um assunto altamente emotivo, então eu tenho medo de fazer uma pergunta dessas.Esta questão não está convidando opiniões pessoais / profissionais sobre regex, apenas situações específicas em que uma solução incluindo seu uso não é tão boa quanto comandos nativos de linguagem (incluindo aqueles que têm código subjacente usando regex) e por quê.

Além disso, observe que Desejável pode significar desempenho, pode significar legibilidade de código; isso não significapanaceia, como cada solução para um problema tem seus benefícios e limitações.

Desculpas se esta for uma duplicata, procurei SO por uma pergunta semelhante.

Sua resposta

8   a resposta
0

Normalmente, usarei apenas a manipulação de texto para substituições de string simples (por exemplo, substituindo tokens em um modelo por valores reais). Você certamente poderia fazer isso com o Regex, mas as substituições são muito mais fáceis.

1

Os RegEx's são muito flexíveis e poderosos, porque são de muitas formas semelhantes a uma declaração eval (). Dito isto, dependendo da implementação, eles podem ser um pouco lentos. Normalmente, isso não é um problema, no entanto, se eles podem ser evitados em um loop particularmente caro, isso pode aumentar o desempenho.

Dito isto, eu costumo usá-los, e só me preocupo com o desempenho quando o aplicativo é "feito" e tenho benchmarks reais para provar que preciso ajustar o desempenho. isto é, evite a otimização prematura.

2

Usar um regex basicamente significa embutir um pequeno programa, escrito em uma linguagem de programação diferente, no meio do seu programa. Ignorarei a ineficiência de usar uma regex sobre manipulação de string nativa, porque provavelmente não é relevante na maioria dos casos.

Eu prefiro a manipulação de texto nativo sobre regex sempre que a manipulação de texto nativo for mais fácil de seguir para outras pessoas. O que é verdade com bastante frequência, já que muitas das pessoas ao meu redor não estão muito familiarizadas com o regex. A menos que se trabalhe com algo que é muito parecido com a análise (via regex), eles não deveriam precisar ser!

Expressões regulares são geralmente mais lentas, menos legíveis e mais difíceis de depurar do que manipulação de strings nativas.

O principal caso em que prefiro a manipulação de regex sobre string é quando quero poder diferenciar as strings de acordo com a fonte, e os tipos de fontes aumentarão com o tempo. A manipulação de string nativa não é realmente prática neste caso. Eu tive casos em que colei uma coluna de regex em um banco de dados ...

6

Eu prefiro a manipulação de texto sobre expressões regulares para analisar entrada de cadeia delimitada. É muito mais simples (para mim, pelo menos) emitir uma divisão de strings do que gerenciar uma expressão regular.

Dado algum texto:

<code>value1, value2, value3
</code>

Você pode analisar a linha facilmente:

<code>var values = myString.Split(',');
</code>

Tenho certeza que há uma maneira melhor, mas com expressões regulares você teria que fazer algo como:

<code>var match = Regex.Match(myString, "^([^,]*),([^,]*),([^,]*)$");
var value1 = match.Group[1];
...
</code>
+1. Além disso, registros de comprimento de campo fixo John Pirie
Deve-se notar que as funções "split" geralmente se dividem em uma regex. Svante
0

Sim. Exemplo:

<code>char* basename (const char* path)
{
  char* p = strrchr(path, '/');
  return (p != NULL) ? (p+1) : path;
}
</code>
1

Sempre que o mesmo resultado pode ser alcançado com uma quantidade razoável de código.

Expressões regulares são muito poderosas, mas elas tendem a ficar difíceis de ler. Se você puder fazer o mesmo com operações de string simples, isso geralmente significa que o código fica mais fácil de gerenciar e manter.

Há alguma sobrecarga na configuração do objeto e na análise da expressão. Para uma manipulação de strings mais simples, você pode obter um melhor desempenho com métodos de strings simples.

Exemplo:
Obtendo o nome do arquivo de um caminho de arquivo (sim, eu sei que a classe Path deve ser usada para isso, é apenas um exemplo ...)

<code>string name = Regex.Match(path, @"([^\\]+)$").Groups[0].Value;
</code>

vs.

<code>string name = path.Substring(path.LastIndexOf('\\') + 1);
</code>

A segunda solução é direta e faz o mínimo de trabalho necessário para obter o resultado. A solução de expressão regular produz o mesmo resultado, mas trabalha mais para analisar a sequência e produz vários objetos que não são necessários para o resultado.

1

Regex parsing and execution refere-se à linguagem h, ost para adiar o processamento para o seu "motor" de regex. Isso adiciona sobrecarga, portanto, para qualquer instância em que a manipulação de string nativa possa ser usada, é preferível a velocidade (e a legibilidade!).

4

Quando você pode fazer issosimplesmente com manipulação de texto nativo, é geralmente preferível (mais simples de ler e melhor desempenho) não usar regex.

Regra pessoal de ouro: se é complicado ou relativamente mais longo fazê-lo "manualmente" e que o ganho de desempenho é insignificante, não o faça. Mais fazer.

Não exemplos:

DivididoSimples encontrar e substituirtexto longolaçofunções nativas existentes (como, em PHP,strrchr, ucwords...)

Perguntas relacionadas