18

2 つのテキスト ブロックの違いを示したいと思います。テキスト行または個々の文字を比較するのではなく、指定された文字 ('\n'、' '、'\t' など) で区切られた単語のみを比較したいと思います。これについての私の主な理由は、比較するテキストのブロックには通常、改行が多くなく、文字の比較がわかりにくいということです。

行と文字を比較するために C# で次の O(ND) ロジックに出くわしましたが、単語を比較するためにそれを変更する方法がわかりません。

さらに、単語間のセパレーターを追跡し、それらが差分に含まれていることを確認したいと思います。したがって、スペースがハードリターンに置き換えられた場合、それを差分として表示したいと思います。

Asp.Net (c#) を使用して、削除された元のテキストと追加された新しいテキストを含むテキスト ブロック全体を表示しています (削除/追加されたことを示すために、両方が強調表示されます)。これらのテクノロジーで動作するソリューションをいただければ幸いです。

これを達成する方法についてのアドバイスをいただければ幸いです。

4

4 に答える 4

17

Microsoftは、CodePlexでdiffプロジェクトをリリースしました。これにより、単語、文字、および行のdiffを実行できます。これは、Microsoft Public License(Ms-PL)の下でライセンスされています。

https://github.com/mmanela/diffplex

于 2010-01-12T21:36:44.810 に答える
1

いくつかの一般的な最適化以外に、比較にセパレーターを含める必要がある場合は、基本的に文字ごとの比較をブレークで行っています。リンクした O(ND) を使用することもできますが、基本的に自分で作成するのと同じくらい多くの変更を加えます。

違いの比較の主な問題は、継続を見つけることです (単語を 1 つ削除し、残りはそのままにしておく場合)。

それらのコードを例から使いたい場合は、削除された文字を書き込まず、同じ場所に置換された文字がある場合は、この結果を出力しないでください。次に、「変更された」単語の最長連続実行を計算し、この文字列を強調表示して出力する必要があります。

申し訳ありませんが、それはあまり答えではありませんが、この問題の答えは基本的に関数を書いて調整することです。

于 2009-12-19T21:31:23.157 に答える
0

' String.Split\n'、' '、および '\t' を使用すると、分割文字として、テキスト ブロック内の単語の配列が返されます。

次に、各配列を比較して違いを確認できます。単純な 1 対 1 の比較で、単語が変更されたかどうかがわかります。比較:

hello world how are you

と:

hello there how are you

はあなたにそれを与えworld、に変更しましたthere

単語が挿入または削除されていて、区切り文字が変更されていないかどうかを確認するために、テキスト ブロックを 1 文字ずつ解析する必要があるかどうかはわかりません。

于 2009-12-19T21:33:18.753 に答える