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.
A comparação é feita no seu navegador. Os textos não são enviados a nenhum servidor.
Achou um resultado errado ou tem uma sugestão? Avise por e-mail.
Como usar
- Cole o texto original à esquerda e o texto modificado à direita.
- Escolha comparar por linha (código e arquivos), palavra (textos) ou caractere (mudanças pequenas).
- Use Ignorar maiúsculas e Ignorar espaços para descartar diferenças que não importam.
- 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.
// 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;
} 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.
Outras ferramentas que podem ajudar
- Formatador JSONFormate, indente, minifique e valide JSON online
- Validador JSONValide JSON online e veja a linha e a coluna do erro, o tipo e a profundidade
- Testador de RegexTeste expressões regulares online: destaque dos casamentos, grupos e flags
- Conversor de Timestamp UnixConverta timestamp Unix (segundos ou milissegundos) em data e hora, e data em timestamp
- Comparador JSONCompare dois JSON online e veja o caminho de cada chave adicionada, removida ou alterada
- Conversor CSV para JSONConverta CSV em JSON online: detecta o separador (vírgula ou ponto e vírgula) e usa o cabeçalho como chaves