在对文本进行对比时,难免需要自己定制对比规则;本文就详细讲解一下有名的对比工具 AraxisMerge 实现自定义对比规则的方法 和 针对 JavaScript代码 的一些实用的对比规则;
目录
- 一、问题
- 二、忽略空格相关的差异
- Lines相关的各配置选项的详细说明
- 三、忽略行尾分号的差异
- Expressions面板中各配置项的详细说明
- 四、忽略非嵌套的单双引号
内容
一、问题
开发工具往往都有格式化代码的功能,然而,JavaScript代码 的格式规范有多种,不同 开发工具 对 JavaScript代码 的格式化规范 可能不一样,比如,语句结束处默认带不带 分号 ;
,导入模块时,路径字符串是用用单引号 还是 双引号,等等,这些差异,导致在对比 JavaScript 代码时,往往会出现很多的差异提示,如下所示:
双引号分号.js
import GBY from "GBY";
var gby = new GBY();
gby.name = "郭斌勇"
console.log(gby) ;
单引号无分号.js
import GBY from 'GBY'
var gby = new GBY()
gby.name = "郭斌勇"
console.log(gby)
对比效果:
注意:图中高亮部分均是被认为是有差异的部分;
从图中可以看出,对比工具把以下区别认为是差异:
- 非嵌套的单引号 与 双引号;
- 行尾 分号 和 行尾 没有 分号;
- 空行;
- 连续的空格;
- 行首空格;
- 行尾空格;
而这些在 JS 中都是等效的;
二、忽略空格相关的差异
在 应用菜单栏:Araxis Merge/Preferences.../Lines
中,勾选以下选项:
或者
在 工具条:Preferences/Whitespace
中,勾选以下选项:
可以忽略如下差异:
- 空行;
- 连续的空格;
- 行首空格;
- 行尾空格;
Lines相关的各配置选项的详细说明
应用菜单栏:Araxis Merge/Preferences.../Lines
下面的选项 是 可以设置应用于文件和文件夹比较窗口执行的文本比较中的行的选项。
-
忽略行首空白处的差异
Ignore differences in whitespace at the start of lines
-
Ignore Leading
选择此选项可在比较文件时忽略行首的空格(空格,制表符,回车符和行尾)。
-
忽略行尾空白处的差异
Ignore differences in whitespace at the end of lines
-
Ignore Trailing
选择此选项可在比较文件时忽略行尾的空格(空格,制表符,回车符和行尾)。
-
将连续的空格视为单个空格
Treat consecutive whitespace as a single space
-
Ignore Consecutive
选中此选项可忽略由于在现有空白字符之后引入额外的空白字符而引起的差异。
- 忽略空格中的所有差异
Ignore all differences in whitespace
-
Ignore All
选择此选项可在比较文件时忽略行内的所有空格(空格,制表符,回车符和行尾)。
- 忽略字符大小写的差异
Ignore differences in character case
-
Ignore Case
选择此选项可使合并忽略行中字符的大小写。如果您要比较不区分大小写的编程语言的源代码,这将特别有用。
- 忽略行尾字符(CR和LF)中的差异
Ignore differences in line-ending characters (CR and LF)
-
Ignore Line Endings
选择此选项以使“合并”在比较文件时忽略Windows样式的行尾(CR LF),UNIX的行尾(LF)和Macintosh的行尾(CR)之间的差异。
-
忽略以下列号/范围输入字段中的字符
Ignore characters in the following column number/ranges entry field
输入比较行时要忽略的列。当比较包含格式正确的表格数据的文件时,忽略列会很有用,尤其是在您难以构造合适的正则表达式的情况下。
列号应以逗号分隔。要指定列的范围,请使用格式n-m。您可以省略范围内的第二个数字,以使范围保持开放式,在这种情况下,范围将扩展到行尾。列从1(非0)开始编号。
例如:
1-8,10,12,14,80-
注意: 选项卡字符被计为单列字符,与已设置的任何选项卡扩展选项无关。
- 数值比较公差
-
Numeric comparison tolerance
此字段定义在比较文本文件中的数值时使用的容差,该文本文件的类型定义为Text with numeric data“ 文件类型”选项页上。如果相应的数值相差小于或等于此处指定的值,则它们将被视为相同。
-
三、忽略行尾分号的差异
忽略行尾分号 的 设置需要通过 表达式来实现了;
在 应用菜单栏:Araxis Merge/Preferences.../Expressions
中
- 点击
+
号 图标,添加一个表达式;
- 在
Expression
中填入以下正则表达式;+(\s*;*)*$
,并按如下图配置:
Expressions面板中各配置项的详细说明
应用菜单栏:Araxis Merge/Preferences.../Expressions
面板用来编辑正则表达式的定义和描述。
Description
: 描述;
使用此字段在下面的字段中输入对表达式行为的描述。Expression
: 正则表达式;
该输入字段包含正则表达式定义。输入字段下方的文本指示输入字段的内容在语法上是否正确。Force entire line unchanged if any part matches the expression
: 如果任何部分匹配表达式,则强制整行不变;
如果行的任何部分包含正则表达式的匹配项,请选择此选项以强制行进入未更改状态。出于合并目的,这导致Merge完全忽略包含该表达式匹配项的任何行。请注意,整行不需要匹配表达式(除非表达式指定必须匹配)。-
Ignore sequences of characters that match the expression
: 忽略与表达式匹配的字符序列;
选择此选项可使“合并”忽略与正则表达式匹配的字符序列。当行除了正则表达式的匹配项之外还可能包含有用的内容时,请使用此选项。例如,您可以使用一个表达式使HTML标记元素被忽略(<[^<]*>
),并使Merge比较其余的行内容。注意:
- 如果由于该行的全部内容与您的正则表达式列表匹配而被忽略,则该行将被视为空白行;它不会被强制进入不变状态。
- 正则表达式匹配算法是贪婪的。例如,一个表达式
<.*>
将导致全部<b>Hello, world!</b>
忽略,而不仅仅是个体<b>
和</b>
序列。
Sample line
: 示例行
您可以在此字段中输入文本的示例行,以查看输入的正则表达式将如何导致字符序列被忽略。-
Remove sequences of characters matching these selected sub-expressions
: 删除与这些所选子表达式匹配的字符序列
默认情况下,合并将忽略与正则表达式匹配的整个字符序列。您可能只想忽略匹配的序列的一部分。例如,如果您想忽略C++
类名中的更改,但要显示类在何处已更改为结构(反之亦然),则可以使用如下表达式:(class|struct)[ \t]+([a-zA-Z0-9_]+)
该表达式包含两个用括号括起来的子表达式。当应用于示例行时:
class SomeClass : public BaseClass {
子表达式列表将显示三个条目:
- 第一个(
All
)是整个正则表达式匹配的字符序列; - 第二个(
1
)是第一个子表达式(class|struct)
匹配的字符序列; - 第三个(
2
)是由第二个子表达式([a-zA-Z0-9_]+)
匹配的字符序列;
如果要忽略类或结构体类型的差异,但 不忽略 类或结构体 实现的差异,则可以选中列表中的 第二个(1
),而不要选中第三个(2
)。
- 第一个(
Sample line, with selected sub-expressions removed
: 示例行,删除了选定的子表达式后的效果;
此字段显示将正则表达式应用于在上面的编辑字段中输入的示例行的效果。字符的匹配序列从样本行中剥离。剩下的就是当比较该行与其他行时,比较引擎将使用的内容。如果已将“合并”配置为忽略行内的空格,则此字段也将显示该效果。
四、忽略非嵌套的单双引号的差异
忽略非嵌套的单双引号 的 设置也需要通过 表达式 ("|')[^"']*(\1)
来实现;
在 应用菜单栏:Araxis Merge/Preferences.../Expressions
中添加一个表达式 ("|')[^"']*(\1)
,并按如下图配置: