简体中文

文本和日常工具·文本工具包

基于行的文本差异解释:为什么一个更改的单词会标记整行

· 工作原理

文本差异 文档比较 编辑

两个子句列表按行对齐,其中一行已删除,一行已添加,突出显示
原始 ToolAcre 矢量图

解释基于行的差异比较的内容、为什么它将单字编辑报告为替换行,以及如何准备两个文本以便比较突出显示实际更改的内容。

说明一切都发生了变化的差异 - 重排的段落如何将一个编辑变成数十个标记行

合同管理员可以更改条款中的一项义务,将两个文档版本粘贴到比较中,并查看围绕该编辑报告的大块。通常的原因并不是每个句子都改变了。从文字处理程序中复制会重新排列该段落,将后面的单词移动到不同的物理行上。

行比较只能对齐它接收到的单位。如果版本 A 将一个段落放在“供应商”之后,而版本 B 将其放在“供应商必须”之后,则即使大多数措辞相同,剩余的行也不再完全匹配。在确定文档包含数十个实质性修订之前,恢复有意的行边界。

行 diff 比较什么 — 以整行为单位,相等匹配,其间插入和删除

ToolAcre 将每个输入分成几行,并比较这些完整的字符串是否相等。它构建一个最长公共子序列表,该表标识双方共享的相同行的最大有序集。然后,这些锚点之间的材料会以从左侧删除的行或添加到右侧的行的形式发射。

顺序与文本一样重要。未更改的子句只能在其按顺序出现的位置锚定对齐;将其移动到其他地方并不由特殊的移动操作表示。结果是一个最小的面向行的编辑脚本,而不是对法律含义的解释或尝试按主题配对相似的句子。

为什么一个单词标记一整行 - 比较单位是行,因此任何差异都会替换它

将“may”更改为“must”会使整行不相等。在此实现中,该行以从旧端删除并添加到新端的方式发出;核心函数不会为单字替换发出更改的行。这两行描述了行粒度的替换,而不是整个想法的删除。

一起读取这些相邻行。他们共享的措辞可以帮助人们找到编辑的术语,但源代码中显示的算法不会突出显示其中的字符。这种区别解释了为什么结果既准确又显得宽泛:其最小的可报告比较单位是一行,无论编辑有多小。

为什么一个字在此实现中产生删除的行和添加的行

字级差异可以更精细地标记散文,并且可以隔离“可能”与“必须”。字符级差异可以进一步缩小显示范围,这对于标点符号或拼写很有用。这些方法还会创建更多碎片,并需要有关令牌边界的规则,因此它们表面上的精确性可能会导致更繁忙的审查。

行比较适合列表、配置块、日志和子句。它为审阅者提供了稳定的上下文并保持顺序,而无需假装理解句子。当审阅必须识别长段落内的编辑时,选择更精细的工具;不要指望这条路线能够制造出这样的细节。

准备好文本以进行良好的比较 — 每行一个句子或一个项目、修剪空白和一致的行结尾

准备两个版本,以便一个句子、编号子句或列表项占据每一行。当这些差异没有意义时,删除意外的空白行并修剪前导或尾随空格。在重要的时候保留有意的缩进,因为比较函数本身会测试精确的行字符串,并且在相等检查之前不会规范化空格。

大纲要求一致的行结尾,但 `toLines` 已经接受 CRLF、LF 和单独的 CR 作为分隔符。更重要的一致性是语义:相同的项目应该在相同的地方开始和结束。避免以页面宽度手动换行,因为更改后的边距可能会伪装成更改后的内容。

准备稳定的生产线单元;混合 CRLF、LF 和单独 CR 已被接受

假设旧清单包含三个单独的行:“1。星期五之前交货。”、“2。买方可以检查记录。”和“3。付款应在 30 天内付款。”修订版仅将中间行更改为“2。买方必须检查记录。”在运行比较之前,将所有三个子句保留在各自的行中。

第一行和第三行保持相同的锚点。旧的中间子句显示为已删除,修订后的中间子句显示为已添加,从而使管理员可以重点审查一对。如果将相同的条款粘贴为重排散文,则换行差异可能会破坏这些锚点并扩大明显的更改集。

这不包括什么 - 三向合并、移动块检测和格式化文档的差异

此比较不执行三向合并,因此它无法根据共享基础版本协调两个已编辑的后代。它也没有移动块分类:重新定位子句可以在其旧位置显示为删除,在其新位置显示为添加,即使其文本未受影响。

格式化文档引入了另一个边界。字体、跟踪更改、表格、注释和布局不会以传递给 `diffLines` 的纯字符串表示。首先提取并构建相关文本,同时保留原始文本以供正式审查。有用的文本差异补充了文档控件;它不会取代它们。

要点 — 文本工具包的差异在设计上是基于行的;准备输入,它会准确显示哪些项目发生了变化

当每一行都包含一个可审查的决策时,行差异提供的信息最多。 ToolAcre 精确对齐行,保留其顺序,并将不匹配的材料报告为添加或删除。这种设计是可以预测的:一个单词的编辑会影响其整行,而其周围的相同行则提供保持结果紧凑的锚点。

在比较子句列表之前,仔细考虑边界,修剪不相关的边缘空间,并删除不添加结构的空行。然后打开文本差异并检查相邻的已删除和添加的行作为替换。良好的准备不会改变合同;它使算法的基于行的报告与审阅者真正关心的单位相匹配。