我在 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
Run Code Online (Sandbox Code Playgroud)
请注意,它们由制表符分隔。第一行的第一个 0 的格式应为 0,00,100 的格式应为 100,00,但 12345678 和日期不应格式为 ,00 最后的 100,5 的格式应为 100,50
我解决了约会的问题,所以现在不那么重要了。
A 部分:垫到特定长度
要使用正则表达式用 N 个字符右填充行,请在行尾添加 N 个空格,然后将前 N 个字符分组替换其余字符。
第 1 步:添加填充字符
查找:$
替换:______________________________
在行尾添加 30 个空格。(我使用下划线,因为空格不会在帖子中格式化)。
步骤 2:修剪左 30 个字符
要在行首填充以破折号分隔的日期,请相应地匹配每个部分。
查找:^([[:print:]]{0,30}).*$
替换为\1
在该行的开头,替换最多 30 个可打印字符的组,然后用该组替换任何剩余的字符。
要选择不同的行长,请在 Pass 1 中使用 n-spaces,然后将 30 替换为 Pass 2 中的长度。
B 部分:以日期开头的行
第 1 步(每月的某一天):
查找内容:^([0-9])-
替换为:0\1-
用填充的零、数字和破折号替换模式(以单个数字开头的行,后跟破折号)。
通过 2(月):
查找内容:-([0-9])-
替换为:-0\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 评论文本
对于第4列:
^((?:\S+\s+){3}\d+)(\s)
到\1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)
到\10\2
对于第 5/7 列:
与上面类似,只需在规则中分别替换{3}
为{4}
/{6}
在第1章追加,0
到数字没有,
。现在所有数字都必须有,\d
.
在第二个规则追加0
到那些逗号后的个位数。
至于(?:)
:non-capture group,前面的列已经被捕获,\1
因此不需要额外的捕获。
这只会将数字填充到小数点后 2 位。要填充任意数量,请使用该pad excessively, then trim
方法。
最后一句话?
在我看来,notepad++ 中的普通正则表达式不足以完成这项任务。一些基本的脚本如 bash 或 perl 会以更高的可读性处理这个问题。
归档时间: |
|
查看次数: |
2318 次 |
最近记录: |