Diff de texto online (comparar dois textos)

O diff de texto compara dois textos e mostra o que foi adicionado, o que foi removido e o que ficou igual. Você pode comparar por linha, por palavra ou por caractere, e ignorar diferenças de maiúsculas e de espaços. A comparação é feita no seu navegador, sem enviar os textos a nenhum servidor.

Atualizado em · Por Leonardo Gaertner

Achou um resultado errado ou tem uma sugestão? Avise por e-mail.

Como usar

  1. Cole o texto original à esquerda e o texto modificado à direita.
  2. Escolha comparar por linha (código e arquivos), palavra (textos) ou caractere (mudanças pequenas).
  3. Use Ignorar maiúsculas e Ignorar espaços para descartar diferenças que não importam.
  4. Em modo de linha, marque Só as diferenças para recolher os trechos iguais. Clique em Copiar diferenças para levar o resultado.

Como funciona

A ferramenta acha a menor sequência de acréscimos e remoções que transforma o primeiro texto no segundo, com o algoritmo de Myers, o mesmo que o git diff usa por padrão. Tudo que não é acréscimo nem remoção é mostrado como igual.

No modo de linha, cada linha é uma unidade, com os números de linha dos dois textos. Nos modos de palavra e de caractere, o resultado sai em um texto só, com o que foi adicionado sublinhado e o que foi removido riscado. Quando o texto é muito longo e quase todo diferente (milhares de linhas), o cálculo é simplificado e o trecho aparece como trocado por inteiro.

O resultado copiado usa + e - no início de cada linha, no modo de linha, ou marca os trechos com [-removido-] e {+adicionado+}, nos demais. Não é o formato completo do git diff, que também traz cabeçalhos e blocos com @@.

Exemplo por linha

Original: a, b, c

Modificado: a, x, c, d

a

- b

+ x

c

+ d

Fonte: Documentação do git diff

Em código

Para comparar textos em código: em JavaScript, pela maior subsequência comum de linhas; em Python, com o difflib, que já gera o formato do git diff.

JavaScript
// Diferença linha a linha pela maior subsequência comum (LCS).
// Exata e curta; para arquivos com milhares de linhas, use o pacote diff ou o git.
function diffLinhas(antes, depois) {
  // \r\n (Windows) e \n (Linux) viram a mesma coisa, senão toda linha parece alterada
  const a = antes.replace(/\r\n?/g, '\n').split('\n');
  const b = depois.replace(/\r\n?/g, '\n').split('\n');
  // lcs[i][j]: quantas linhas em comum há entre a[i..] e b[j..]
  const lcs = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
  for (let i = a.length - 1; i >= 0; i--) {
    for (let j = b.length - 1; j >= 0; j--) {
      lcs[i][j] = a[i] === b[j]
        ? lcs[i + 1][j + 1] + 1
        : Math.max(lcs[i + 1][j], lcs[i][j + 1]);
    }
  }
  const saida = [];
  let i = 0;
  let j = 0;
  while (i < a.length || j < b.length) {
    if (i < a.length && j < b.length && a[i] === b[j]) {
      saida.push(`  ${a[i++]}`);
      j++;
    } else if (i < a.length && (j === b.length || lcs[i + 1][j] >= lcs[i][j + 1])) {
      saida.push(`- ${a[i++]}`);
    } else {
      saida.push(`+ ${b[j++]}`);
    }
  }
  return saida;
}
Python
import difflib


def diff_unificado(antes: str, depois: str, nome: str = "arquivo") -> str:
    """O mesmo formato do git diff e do comando patch."""
    linhas = difflib.unified_diff(
        antes.splitlines(),
        depois.splitlines(),
        fromfile=f"a/{nome}",
        tofile=f"b/{nome}",
        lineterm="",
    )
    return "\n".join(linhas)


def semelhanca(antes: str, depois: str) -> float:
    # De 0 a 1 (1 = iguais). Serve para achar textos parecidos, não para gerar patch
    return difflib.SequenceMatcher(None, antes, depois).ratio()

Perguntas frequentes

Qual a diferença entre comparar por linha, palavra e caractere?

Por linha, a unidade é a linha inteira, o que serve para código e arquivos de configuração. Por palavra, o diff aponta as palavras que mudaram dentro de um texto. Por caractere, mostra até uma letra trocada, útil para achar erros de digitação.

Por que uma linha aparece como diferente se parece igual?

Provavelmente por um espaço a mais no fim ou no meio da linha, ou por letras maiúsculas e minúsculas. Marque Ignorar espaços ou Ignorar maiúsculas para descartar essas diferenças.

Como comparar dois JSONs?

Formate os dois com o formatador de JSON do PraDev, com a mesma indentação e, se preferir, com as chaves ordenadas, e cole o resultado aqui no modo de linha. Assim só aparecem as diferenças de conteúdo.

Os textos que eu colo são enviados a algum servidor?

Não. A comparação acontece no seu navegador e o conteúdo não é enviado nem armazenado pelo PraDev.