сравнить текст и получить различия

Ну, я хочу сравнить 2 строки (первая и вторая версии) и получить различия в формате, который я могу конвертировать в html самостоятельно, как вы можете посмотреть, как пост был отредактирован здесь при переполнении стека или как svn отслеживает различия между ревизиями ....

Это должна быть библиотека полного управляемого кода.

Мне нравится этот JavaScript, но мне нужно сделать это на стороне сервера. .

7 голосов | спросил Peter 18 J000000Monday11 2011, 15:10:17

2 ответа


0

У меня есть библиотека классов, которая делает это, я опубликую ссылку ниже, но я также опубликую, как она выполняет свою работу, чтобы вы могли оценить, будет ли она соответствовать вашему контенту.

Обратите внимание, что для всего, что я скажу ниже, если вы рассматриваете каждый символ как элемент коллекции, вы можете реализовать алгоритм, описанный ниже, для любого типа контента. Будь то символы строки, строки текста, коллекции ORM-объектов.

Весь алгоритм вращается вокруг longest-common-substring (LCS) и является рекурсивным подход.

Сначала алгоритм пытается найти LCS между ними. Это будет самый длинный раздел, который не изменился /идентичен между двумя версиями. Затем алгоритм считает эти две части «выровненными».

Например, вот как две строки примера будут выровнены:

      This long text has some text in the middle that will be found by LCS
This extra long text has some text in the middle that should be found by LCS
          ^-------- longest common substring --------^

Затем он рекурсивно применяет себя к частям перед выровненным участком, а к части после.

Конечный «результат» может выглядеть следующим образом (я использую подчеркивание, чтобы указать части «не там» в одной из строк):

This ______long text has some text in the middle that ______will be found by LCS
This extra long text has some text in the middle that should____ be found by LCS

Затем, как часть рекурсивного подхода, каждый уровень рекурсивного вызова будет возвращать коллекцию «операций», которые в зависимости от того, есть ли LCS или отсутствующие части в любой части, будут выплевываться следующим образом:

  • Если LCS, то это операция "копирования"
  • Если сначала отсутствует, то это операция вставки
  • Если пропущено второе, это операция удаления

Таким образом, приведенный выше текст будет таким:

  1. Скопируйте 5 символов (This)
  2. Вставьте extra_ (очевидно, кодовые блоки здесь удаляют пробел, подчеркивание - пробел)
  3. Скопируйте 43 символа (long text has some text in the middle that_)
  4. Вставьте should
  5. Удалить 4 символа (will)
  6. Скопируйте 16 символов (_be found by LCS)

Суть алгоритма довольно проста, и с помощью приведенного выше текста вы сможете реализовать его самостоятельно, если хотите.

В моей библиотеке классов есть некоторые дополнительные функции, в частности, для обработки таких вещей, как контент, похожий на измененный текст, так что вы не просто получаете операции удаления или вставки, но также измените операции, это будет в основном важно, если вы сравниваете список чего-либо, например строки из текстовых файлов.

Библиотеку классов можно найти здесь: DiffLib в CodePlex , и вы также найдите его в Nuget для легкой установки в Visual Studio 2010. Он написан на C # для .NET 3.5 и выше, поэтому он будет работать для .NET 3.5 и 4.0, и поскольку это бинарный выпуск (весь исходный код находится на CodePlex, хотя ), вы также можете использовать его из VB.NET.

ответил Lasse Vågsæther Karlsen 18 J000000Monday11 2011, 15:25:05
0

У Google есть нечто похожее, и оно доступно в C #, но не рассматривало его более подробно. Демо выглядит довольно круто, хотя.

http://code.google.com/p/google-diff -match патч /

ответил Remy 18 J000000Monday11 2011, 15:30:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132