我对 RegEx 很在行,但有一件事我似乎无法弄清楚它是如何工作的。
如何在 NotePad++ 中搜索/替换并确保输出具有固定长度,而输入可以灵活?
例如,对此执行正则表达式:23-6-2016
变成:(23-06-2016
例如,06 为额外的 0,但如果是 12 则不需要)
另一个选择是创建这个:
TestString
并Test
会变成
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-
将模式(两个破折号之间的单个数字)替换为破折号、填充的零、数字和破折号。