Инструмент сравнения текста
Что такое сравнение текста?
Text Diff сравнивает две версии текста и подсвечивает строки или фрагменты, которые были добавлены, удалены, изменены или остались прежними. Он полезен при проверке кода, конфигураций, переводов, черновиков договоров, Markdown-документов, версий промптов, заметок к релизу и фрагментов логов, когда неудобно читать две копии вручную. Инструмент особенно ценен, если маленькая правка спрятана в длинном тексте или если могли случайно измениться пробелы, пунктуация, форматирование либо порядок строк. Diff не решает, правильна ли новая версия; он точно показывает различия, чтобы ревью было сосредоточенным. Это снижает риск пропустить важную мелочь. Для опубликованного или многоязычного контента результат нужно проверить по языку, charset, контексту и edge cases.
Как использовать
Как использовать
- Вставьте исходный текст в левое поле ввода
- Вставьте изменённый текст в правое поле ввода
- Система автоматически вычислит и подсветит различия, а в строке состояния отобразится количество добавленных и удалённых строк
Рекомендации по проверке
- Перед сравнением нормализуйте переносы строк и пробелы, если суть изменения — в содержимом, а не в форматировании.
- Для кода или юридических текстов просматривайте выделенные изменения вручную: автоматическое сравнение показывает различия, но не оценивает намерение или корректность.
Применение
Технический принцип
Построчное сравнение основано на задаче о наибольшей общей подпоследовательности (LCS): даны две последовательности строк A и B, найти самую длинную последовательность, которая встречается в обеих в том же относительном порядке. Всё, что не входит в LCS, является либо вставкой (есть в B, но нет в A), либо удалением (есть в A, но нет в B), — именно эти строки отображаются красным и зелёным в боковом обзоре. Наивная таблица динамического программирования для LCS работает за время и память O(M × N), где M и N — количество строк в двух входных данных. На практике движок сравнения использует алгоритм Майерса (Eugene Myers, 1986), который решает ту же задачу за O((M + N) × D) времени, где D — расстояние редактирования между двумя файлами. Для двух файлов, которые в основном идентичны, D невелико, и алгоритм Майерса значительно быстрее полной таблицы ДП; внутренний механизм сравнения Git, веб-интерфейс diff на GitHub и большинство панелей сравнения в IDE используют алгоритм Майерса или один из его потомков (patience diff, histogram diff) именно по этой причине. Patience diff дополнительно выравнивает по уникально встречающимся строкам, что даёт более читаемые блоки при перемещении участков кода. Выход — это последовательность операций equal/insert/delete, отображаемых как unified diff в CLI-инструментах (с заголовками блоков @@ -m,n +p,q @@ и одним префиксом +/- на строку) или как боковые окрашенные строки в веб-интерфейсе. Сравнение на уровне символов или слов использует тот же алгоритм на более мелкой последовательности, часто в сочетании с расстоянием Левенштейна (стоимость вставки + удаления + замены), когда замены нужно считать как одну операцию. Библиотека diff-match-patch от Neil Fraser является стандартной справочной реализацией для посимвольного сравнения в вебе.
- Основа LCS: наибольшая общая подпоследовательность двух массивов строк определяет неизменённые строки; всё остальное — вставка или удаление
- Алгоритм Майерса (1986): O((M + N) × D) времени, где D — расстояние редактирования; используется по умолчанию в Git, GitHub и большинстве IDE
- Наивное ДП: O(M × N) по времени и памяти — подходит для небольших входов, но квадратичная память делает его непрактичным для больших файлов
- Patience diff: выравнивает по уникально встречающимся строкам; даёт более чистые блоки при перемещении или переупорядочивании участков
- Форматы вывода: unified diff с заголовками @@ -m,n +p,q @@ для CLI; боковые окрашенные строки для веб-интерфейса
- Гранулярность: построчное / пословное / посимвольное сравнение применяет тот же алгоритм к разному разбиению входных данных
- Расстояние Левенштейна: считает вставки + удаления + замены; diff-match-patch — справочная веб-библиотека
Примеры
Обнаружение изменения одного слова внутри абзаца
Оригинал:
The server starts on port 3000 by default.
Изменённый:
The server starts on port 8080 by default.
Результат: 1 строка изменена (3000 -> 8080)Сравнение двух версий блока конфигурации
Оригинал: Изменённый:
timeout: 30 timeout: 60
retries: 3 retries: 3
debug: false debug: true
log_level: info
Результат: добавлено 2 строки, удалено 2 строкиСравнение примечаний к выпуску до и после
Удалено (красный):
- Fixed login redirect on Safari 16
Добавлено (зелёный):
- Fixed login redirect on Safari 16 and 17
- Added dark mode preference sync
Результат: добавлено 2 строки, удалена 1 строкаОбнаружение переупорядоченных ключей JSON
Оригинал: Изменённый:
{ "name": "alice", { "id": 1,
"id": 1, "name": "alice",
"role": "admin" } "role": "admin" }
Результат: 2 строки изменены (порядок ключей различается, значения идентичны)Часто задаваемые вопросы
Какой тип сравнения он показывает?
Построчное сравнение. Страница показывает две панели рядом: удалённые строки выделены красным слева, добавленные — зелёным справа. Номера строк помогают находить изменения. Строка состояния показывает количество добавленных и удалённых строк.
Какой алгоритм сравнения используется?
Страница применяет алгоритм Longest Common Subsequence (LCS) для построения скрипта правок на уровне строк. Для типичных размеров документов он работает в реальном времени по мере ввода. Алгоритм находит кратчайшую последовательность вставок и удалений, превращающую левый текст в правый.
Почему сравнение выглядит иначе, чем в git diff?
У Git своя реализация diff с настраиваемыми алгоритмами. Эта страница использует JavaScript-сравнение на основе LCS, работающее полностью в браузере. Формат вывода и границы хунков могут немного отличаться от git diff, но сама детекция изменений на уровне строк корректна.
Можно ли сравнить только в пределах абзаца или предложения?
Да — вставьте каждую версию в свою сторону. На странице есть и подсветка изменений на уровне символов внутри изменённых строк — благодаря ей переименование «foo to bar» отображается как inline-замена, а не как два независимых изменения.
Игнорирует ли он пробелы?
Нет. По умолчанию сравнение чувствительно к пробельным символам. Различия в пробелах (висячие пробелы, лишние пустые строки, разные окончания строк) показываются как изменения.
Можно ли сравнивать JSON или XML структурно?
Текстовый diff работает построчно. Для сравнения JSON по ключам (ключ «a» переехал с позиции 1 на 3 с тем же значением — это не изменение) используйте JSON-aware-инструменты (jsondiffpatch, json-diff). Эта страница — для текстового сравнения.
Загружается ли мой текст?
Нет. Сравнение выполняется в браузере. Оба ввода обрабатываются локально и никуда не передаются.