【发布时间】:2018-09-20 04:45:12
【问题描述】:
我有一个文本文件,其中某些行的格式与其他行不同。更准确地说:在这种类型的行中,字段写在 9 个字符上,而在其他行中,字段的长度为 7 个字符。 (格式错误的)行的格式为: 第一个字段包含 40 个字符,然后是 4 个空格,然后是 1 个字符(名为 note 的字段,例如字母 'a'、空格 '' 或字母 'b'),然后是 4 个空格。前面的序列4个空格+1个字符+4个空格(下例)重复了很多次:
a
这样的一行例如是:
a a a a a c b a a a a a
由于这些行的特殊性,我得到了行之间的偏移:
26 26 26 26 26 26 26 26 26 26 26 a a a a a c b a a a a
我想去掉 2 个不需要的空格,这样在我的行上,一个字段将变成 7 个字符宽,就像其他的一样: 第一个字段包含 40 个字符,然后是 3 个空格,然后是 1 个字符(名为 note 的字段,例如字母 'a'),然后是 3 个空格。
我可以使用 Notepad++ 中的正则表达式“找到”这样的一行:
Find what : ^ {40}(( {4})(?<note>.)( {4}))+
但是如何将4个空格+1个字符+4个空格的所有话语替换为3个空格+1个字符+3个空格,使每一行的字段长度相同?
替换后所需的格式例如是:
26 26 26 26 26 26 26 26 26 26 26 a a a a a c b a a a a
这里是偏移文件的较大摘录:
20/03/2018 H0917 26_LAV 0 Semaine 2 En service le 04 Septembre 2017 - TAD Partiel 11/07/2017 16:09 H0917 Vertical Notes Montferrier-sur-Lez - Cirad de Baillargu Montferrier-sur-Lez - Cirad de Baillarguet Montpellier Occitanie Montpellier Occitanie 26 Occitanie - Montferrier-sur-Lez 26 Montferrier-sur-Lez - Cirad de BaillarguMontpellier Occitanie Montferrier-sur-Lez - Cirad de Baillarguet ########## VOYAGES 0 Semaine Montferrier-sur-Lez - Cirad de Baillarguet 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 a a a a a c b a a a a a a a a a a Occitanie 6:50 7:20 7:50 8:20 8:50 9:30 10:10 10:40 11:10 11:40 12:10 12:10 12:40 13:10 13:40 14:10 14:40 15:10 15:40 16:10 16:40 17:10 17:40 18:10 18:40 19:10 19:40 20:10 20:40 Lycée Frédéric Bazille 6:58 7:28 7:58 8:28 8:58 9:37 10:17 10:47 11:17 11:47 12:17 12:17 12:47 13:17 13:47 14:18 14:48 15:18 15:48 16:18 16:49 17:19 17:49 18:19 18:49 19:18 19:47 20:17 20:47 La Lironde 7:02 7:32 8:02 8:35 9:05 9:42 10:22 10:52 11:22 11:52 12:23 12:23 12:52 13:22 13:52 14:23 14:53 15:23 15:53 16:23 16:56 17:26 17:56 18:26 18:56 19:23 19:52 20:22 20:52 Chemin Neuf 7:07 7:37 8:07 8:40 9:10 9:47 10:27 10:57 11:27 11:57 12:28 12:28 12:57 13:27 13:57 14:28 14:58 15:28 15:58 16:28 17:01 17:31 18:01 18:31 19:01 19:28 19:57 20:27 20:57 La Grand Font 7:08 7:38 8:08 8:41 9:11 9:48 10:28 10:58 11:28 11:58 12:29 12:29 12:58 13:28 13:58 14:29 14:59 15:29 15:59 16:29 17:02 17:32 18:02 18:32 19:02 19:29 19:58 20:28 20:58 Picadou 7:09 7:39 8:09 8:42 9:12 9:49 10:29 10:59 11:29 11:59 12:30 12:30 12:59 13:29 13:59 14:30 15:00 15:30 16:00 16:30 17:03 17:33 18:03 18:33 19:03 19:30 19:59 20:29 20:59 Distillerie 7:11 7:41 8:11 8:44 9:14 9:51 10:31 11:01 11:31 12:01 12:32 12:32 13:01 13:31 14:01 14:32 15:02 15:32 16:02 16:32 17:05 17:35 18:05 18:35 19:05 19:32 20:01 20:31 21:01 Cirad de Baillarguet 7:14 7:44 8:14 8:47 9:17 9:54 10:34 11:04 11:34 12:04 12:35 12:35 13:04 13:34 14:04 14:35 15:05 15:35 16:05 16:35 17:08 17:38 18:08 18:38 19:08 19:35 20:04 20:34 21:04
正确的文件应该是:
20/03/2018 H0917 26_LAV 0 Semaine 2 En service le 04 Septembre 2017 - TAD Partiel 11/07/2017 16:09 H0917 Vertical Notes Montferrier-sur-Lez - Cirad de Baillargu Montferrier-sur-Lez - Cirad de Baillarguet Montpellier Occitanie Montpellier Occitanie 26 Occitanie - Montferrier-sur-Lez 26 Montferrier-sur-Lez - Cirad de BaillarguMontpellier Occitanie Montferrier-sur-Lez - Cirad de Baillarguet ########## VOYAGES 0 Semaine Montferrier-sur-Lez - Cirad de Baillarguet 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 a a a a a c b a a a a a a a a a a Occitanie 6:50 7:20 7:50 8:20 8:50 9:30 10:10 10:40 11:10 11:40 12:10 12:10 12:40 13:10 13:40 14:10 14:40 15:10 15:40 16:10 16:40 17:10 17:40 18:10 18:40 19:10 19:40 20:10 20:40 Lycée Frédéric Bazille 6:58 7:28 7:58 8:28 8:58 9:37 10:17 10:47 11:17 11:47 12:17 12:17 12:47 13:17 13:47 14:18 14:48 15:18 15:48 16:18 16:49 17:19 17:49 18:19 18:49 19:18 19:47 20:17 20:47 La Lironde 7:02 7:32 8:02 8:35 9:05 9:42 10:22 10:52 11:22 11:52 12:23 12:23 12:52 13:22 13:52 14:23 14:53 15:23 15:53 16:23 16:56 17:26 17:56 18:26 18:56 19:23 19:52 20:22 20:52 Chemin Neuf 7:07 7:37 8:07 8:40 9:10 9:47 10:27 10:57 11:27 11:57 12:28 12:28 12:57 13:27 13:57 14:28 14:58 15:28 15:58 16:28 17:01 17:31 18:01 18:31 19:01 19:28 19:57 20:27 20:57 La Grand Font 7:08 7:38 8:08 8:41 9:11 9:48 10:28 10:58 11:28 11:58 12:29 12:29 12:58 13:28 13:58 14:29 14:59 15:29 15:59 16:29 17:02 17:32 18:02 18:32 19:02 19:29 19:58 20:28 20:58 Picadou 7:09 7:39 8:09 8:42 9:12 9:49 10:29 10:59 11:29 11:59 12:30 12:30 12:59 13:29 13:59 14:30 15:00 15:30 16:00 16:30 17:03 17:33 18:03 18:33 19:03 19:30 19:59 20:29 20:59 Distillerie 7:11 7:41 8:11 8:44 9:14 9:51 10:31 11:01 11:31 12:01 12:32 12:32 13:01 13:31 14:01 14:32 15:02 15:32 16:02 16:32 17:05 17:35 18:05 18:35 19:05 19:32 20:01 20:31 21:01 Cirad de Baillarguet 7:14 7:44 8:14 8:47 9:17 9:54 10:34 11:04 11:34 12:04 12:35 12:35 13:04 13:34 14:04 14:35 15:05 15:35 16:05 16:35 17:08 17:38 18:08 18:38 19:08 19:35 20:04 20:34 21:04
感谢您的帮助, 朱利安
【问题讨论】:
-
为什么不将所有出现的
a\s*替换为a? (即a后跟任意数量的空格,a后跟正好 7 个空格。) -
可能是
(?<!\S) {4}(\S) {4}(?!\S)-><3spaces>$1<3spaces>。 -
感谢 Adam 的提议,但由于注释字段也可以是空格字符,正如我所指出的,这些将不匹配。此外,如果我允许这 9 个空格匹配而不考虑该行的其余部分,则其他空格字符串将匹配并被全部替换。
-
对不起,我的意思是感谢 Wiktor。
-
另外,由于亚当编辑了我的问题,显示的格式不再代表我所面临的文本文件。