# 重命名替换规则

## 基本语法

![重命名规则语法](../images/rename_pattern_rule_flow.png)

## 示例

假设正则表达式中的捕获组1为apple

(例如，用正则表达式`\b(a\w+)\b`去匹配文本apple,第一个捕获组(即第一个括号)就是apple)

| 重命名规则        | 结果        |
|:---------------:|:----------:|
| $$              | $          |
| $1              | apple      |
| $2              | ⟦空⟧        |
| $1>U            | APPLE      |
| $1>L            | apple      |
| $1>F            | Apple      |
| $1{le>lication} |application |
| $1{A>b}         | apple      |
| $1>F{A>b}       | bpple      |
| $1{p>b}{a>p}    | pbble      |
| $1{a>p}{p>b}    | bbble      |

假设有四条重命名的名称，其中每一条匹配到的字符串为：
* 字符串1捕获组1: 100
* 字符串2捕获组1: 500
* 字符串3捕获组1: 500
* 字符串4捕获组1: 1300

| 字符串  | 重命名规则 | 结果 |
|:------:|:--------:|:----:|
| 字符串1 | $1>N     | 1    |
| 字符串2 | $1>N     | 2    |
| 字符串2 | $1>N     | 2    |
| 字符串3 | $1>N     | 3    |

## 编写匹配模式

匹配模式是一个正则表达式，详细的语法可以参考[正则表达式](regexp.md)文档

首先，观察需要匹配的井次名称。

![重命名导入界面](../images/rename_01.png)

重命名导入界面如图所示，在窗口的左侧列表里，就是需要匹配的井次名称。
列表中的一项，重命名前的名称为`DN2-4-DW10/VOLT`。

观察这个名称，可以将这个名称分为几部分：

* `DN2-4`是井名称
* `DW`是上测或下测
* `10`是不同测次
* `VOLT`是数据曲线的名称

我们需要分别匹配这几个部分，作为捕获组里的内容，这样在重命名替换时就可以使用特定的部分了。

首先在匹配模式输入框里输入`.*`，英文字符点`.`表示匹配任何字符，英文字符星号`*`表示匹配任意多个数量。
合在一起就是表示匹配任意数量的任意字符。点击预览，可以看到左边列表的所有曲线都被选中，说明匹配成功。
在这个基础上，我们继续修改匹配模式，来匹配名称中的各个部分。

观察井名称这个部分，`DN2-4`由英文字母、数字和短横杠组成，此外井名称还可能有空格和下划线。
为了匹配这一部分，我们在匹配模式前面加上`([\w-_ ]+)`，此时匹配模式变为`([\w-_ ]+).*`。

在这个部分，圆括号`()`表示一个捕获组，方括号`[]`表示一个字符集合，反斜杠加英文字母w`\w`表示匹配英文字母和数字。
`[\w-_ ]`表示匹配英文字母和数字，加上短横杠、下划线和空格。加号`+`表示匹配一个或多个字符。
所有这些合在一起，表示匹配多个由英文字母、数字、短横杠、下划线和空格组成的字符，并将结果作为一个捕获组。
由于这是第一个，所以它的捕获组编号为1。

为了显示匹配的结果，在替换模式里面输入`$1`，表示使用第1个捕获组，点击预览，查看匹配到的捕获组1的结果。
可以看到右边列表结果为`DN2-4-DW10`，这是由于正则表达式默认会尽可能多的匹配，在斜杠前面的都符合规则，于是都被匹配到了。

![重命名导入预览捕获组1](../images/rename_02.png)

这里先不管匹配的结果是否匹配多了，能匹配到我们需要的字符就行。继续修改我们的匹配模式，接下来匹配`DW`，即上测或下测的标识。
由于都是大写字母，且数量为2到4个字符，我们可以将匹配模式写成`([A-Za-z]{2,4})`。
在这里面，`[A-Zz-a]`表示匹配A-Z和a-z即所有的大小写字母，`{2,4}`表示匹配2到4次，即2到4个字符。

然后将这一部分加入我们的匹配模式，得到`([\w-_ ]+)-([A-Za-z]{2,4}).*`，即使用短横线连接井名称和上测下测。
同时修改替换模式为`$1     $2`来预览我们的结果。可以看到结果为`DN2-4     DW`，匹配成功。

![重命名导入预览捕获组2](../images/rename_03.png)

然后编写第三部分，即标识测次的部分。`10`是一个数字，根据经验，这个数字应该在1到4位数之间。
因此，这个部分的匹配模式可以写为`(\d{1,4})`，其中反斜杠加英文字母d`\d`表示匹配数字。
合并之后的匹配模式为`([\w-_ ]+)-([A-Za-z]{2,4})(\d{1,4}).*`，这个部分和上测下测部分之间没有任何分隔字符。

同时修改替换模式为`$1     $2     $3`来预览我们的结果。可以看到结果为`DN2-4     DW     10`，匹配成功。

最后匹配曲线名称部分。`VOLT`曲线名称由字母组成，但是在某些不规范的井中，可能还有数字在里面。
这里简单地使用`(\w+)`来匹配即可， 即匹配一个或多个字母或数字。

合并并删掉最后的`.*`，匹配模式为`([\w-_ ]+)-([A-Za-z]{2,4})(\d{1,4})\/(\w+)`。
反斜杠表示转义，`\/`即标识斜杠字符本身，用来连接曲线名称部分与其它部分。

同时修改替换模式为`$1     $2     $3     $4`来预览我们的结果。

![重命名导入预览捕获组3](../images/rename_04.png)

可以看到结果为`DN2-4     DW     10     VOLT`，匹配成功。
将所有的部分都捕获到独立的捕获组中，此时就成功编写了一个匹配模式。

## 编写替换模式

重命名的最终目的是，将曲线导入成`VOLT_D1`这种形式，即包含了曲线名称，上测下测，以及测次的名称。
利用前面匹配到的捕获组，我们可以替换出正确的曲线名。

首先是曲线名称部分，这里基本保持原样，可以转换一下大写，并替换一些不合理的名称。
首先引用一下匹配模式里捕获了曲线名称的捕获组，在这个例子里是捕获组4，即`$4`。
然后添加转大写字母的指令即大于号加大写英文字母U，替换规则变为`$4>U`，完成曲线名称这一部分。

然后是上测下测部分，要把`DW`替换为`D`，并把`UP`替换为`U`。这里先取对应的捕获组2，即`$2`。
要做文本替换，可以使用文本替换指令。`{DW>D}`表示把`DW`替换为`D`，`{UP>U}`表示把`UP`替换为`U`。
最后组合在一起得到`$2{DW>D}{UP>U}`，即对捕获组2先替换DW再替换UP，这就是上测下测部分的替换规则。

最后是测次的部分，需要把`10`、`20`、`30`等这样的数字变成序号，先取对应的捕获组3，即`$3`。
然后用编号的指令，替换规则变为`$4>N`，就完成了测次部分的规则。

将上面三个部分用合适的字符连接起来，就得到了最终的替换规则`$4>U_$2{DW>D}{UP>U}$4>N`。
点击预览按钮，即可查看最终的结果。

![重命名导入预览替换规则](../images/rename_05.png)
