Notepad++ 中的 RegEx 字符串格式

Notepad++ 中的 RegEx 字符串格式

我对 RegEx 很在行,但有一件事我似乎无法弄清楚它是如何工作的。

如何在 NotePad++ 中搜索/替换并确保输出具有固定长度,而输入可以灵活?

例如,对此执行正则表达式:23-6-2016变成:(23-06-2016例如,06 为额外的 0,但如果是 12 则不需要)

另一个选择是创建这个:

TestStringTest会变成
TestString______________________(额外空格。)
Test____________________________(额外空格。)

当然,这里的想法是进行大规模搜索/替换,其中输出都具有相同的长度。

请解释一下背后的想法。

编辑:为了让您了解我正在处理的数据,这里有一个我需要处理的示例行:

12345678    TXT 19700101    0   100 20160624    100 Comment text
12345678    TXT 19700101    100 100,25  20160624    0,25    Comment text
12345678    TXT 19700101    100,25  100,5   20160624    0,25    Comment text

请注意,这些数字之间用制表符分隔。第一行中的第一个 0 应格式化为 0,00,100 应格式化为 100,00,但 12345678 和日期不应格式化为 ,00,最后一个 100,5 应格式化为 100,50

我已经解决了约会的问题,所以现在这不再那么重要了。

答案1

回应:

12345678 TXT 19700101 0 100 20160624 100 注释文本
12345678 TXT 19700101 100 100,25 20160624 0,25 评论文本
12345678 TXT 19700101 100,25 100,5 20160624 0,25 注释文本

对于第四列:
^((?:\S+\s+){3}\d+)(\s)\1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)\10\2

对于第 5/7 列:
与上面类似,只需在规则中分别替换{3}{4}/{6}

解释
第一条规则

第一条规则附加,0到没有 的数字,。现在所有数字都必须有,\d

第二条规则

第二条规则0在逗号后只有一位数字的位置附加 a 。

至于(?:):非捕获组,前面的列已经被捕获,\1因此不需要额外的捕获。

这只会将数字填充到小数点后 2 位。要填充任意数量,请使用pad excessively, then trim方法。

最后的话?
在我看来,notepad++ 之类的普通正则表达式不足以完成这项任务。一些基本的脚本(如 bash 或 perl)可以以更高的可读性处理此任务。

答案2

A 部分:填充至特定长度

要使用正则表达式在行右填充 N 个字符,请在行尾添加 N 个空格,然后将前 N 个字符分组替换其余字符。

第 1 步:添加填充字符

查找:$替换:______________________________

在行末添加 30 个空格。(我使用下划线,因为空格不会在帖子上格式化)。

第 2 步:修剪左侧 30 个字符

要在行首填充破折号分隔的日期,请相应地匹配每个部分。

查找:^([[:print:]]{0,30}).*$ 替换为\1

在该行的开头,用该组替换一组最多 30 个可打印字符以及其后的任何剩余字符。

要选择不同的线长,请在 Pass 1 中使用 n 个空格,然后在 Pass 2 中用长度替换 30。

B 部分:以日期开头的行

通行证 1(月份日期):

查找内容:^([0-9])- 替换为:0\1-

用填充的零、数字和破折号替换模式(以单个数字开头,后跟破折号的行)。

通票2(月)

查找内容:-([0-9])- 替换为:-0\1-

将模式(两个破折号之间的单个数字)替换为破折号、填充的零、数字和破折号。

相关内容