2009-12-19 2 views
17

Я хотел бы показать различия между двумя блоками текста. Вместо сравнения строк текста или отдельных символов я хотел бы просто сравнить слова, разделенные указанными символами (например, \ n,,,,,,,,,). Мое основное соображение заключается в том, что в блоке текста, который я буду сравнивать, в целом не так много разрывов строк, и сравнение букв может быть непросто.Как отображать различия слов с помощью C#?

Я столкнулся с следующим O(ND) logic in C# для сравнения строк и символов, но я как бы не понимаю, как его изменить, чтобы сравнить слова.

Кроме того, я хотел бы отслеживать разделители между словами и убедиться, что они включены в diff. Поэтому, если пространство заменено жестким возвратом, я бы хотел, чтобы это появилось как diff.

Я использую Asp.Net (C#) для отображения всего блока текста, включая удаленный исходный текст и добавленный новый текст (оба будут выделены, чтобы показать, что они были удалены/добавлены). Будет оценено решение, которое работает с этими технологиями.

Любой совет, как это сделать, оценен.

+0

Удачи. Сотрудник моего отдела сделал это для выпуска нашей флагманской линейки продуктов. Он был достаточно оспорен.И он использовал несколько статей теории, чтобы руководить его работой ... цепляясь за качество письма. –

ответ

15

Microsoft выпустила проект diff на CodePlex, который позволяет выполнять различие слов, символов и строк. Он лицензируется по лицензии Microsoft Public (Ms-PL).

https://github.com/mmanela/diffplex

+2

DiffPlex позволяет вам определить пользовательскую функцию для разделения текста до его разграничения. Вы можете использовать метод: DiffResult CreateCustomDiffs (строка oldText, струнный newText, BOOL ignoreWhiteSpace, Func <строка, строка []> Chunker) где Chunker говорит DiffPlex, что атомные единицы для сравнения друг против друга. –

+0

Привет, Джим, я ищу аналогичное решение, хотел узнать ваше мнение, если использовать diffplex, так как решается ваша проблема? –

+0

Похоже, что я использовал http://www.codeproject.com/Articles/11454/A-word-wise-HTML-text-compare-and-merge-engine для своего решения. Я не помню, почему я использовал его через diffplex, tbh. Это решение обертывает удаленные и добавленные слова в определенные теги html, позволяя вам стиль, как вы хотите. –

1

За исключением нескольких общих оптимизаций, если вам нужно включить разделители в сравнение, вы по существу делаете символ по сравнению с перерывами. Хотя вы можете использовать O (ND), с которым вы связаны, вы собираетесь сделать так много изменений, как вы в основном пишете свои собственные.

Основная проблема сравнения различий заключается в нахождении продолжения (если я удалю одно слово, но оставлю все остальное).

Если вы хотите использовать их начало кода с примером и не записывать удаленные символы, если заменены символы в одном и том же месте, не выводите этот результат. Затем вам нужно вычислить самый длинный непрерывный запуск «измененных» слов, выделить эту строку и вывод.

Извините, что это не очень ответ, но для этой проблемы ответ в основном заключается в написании и настройке функции.

0

Ну, String.Split с символами «\ n», «» и «\ t», так как разделительные символы возвращают вам массив слов в вашем блоке текста.

Затем вы можете сравнить каждый массив для различий. Простое сравнение 1: 1 скажет вам, было ли какое-либо слово изменено. Сравнение:

hello world how are you 

и:

hello there how are you 

даст вам, что world и изменено на there.

Что бы это не сказало вам, если бы слова были вставлены или удалены, и вам все равно придется разбирать символы текстовых блоков по символу, чтобы увидеть, был ли изменен какой-либо из символов разделителя.

+1

Боюсь, что String.Split для больших блоков текста будет неэффективным. –

Смежные вопросы