【问题标题】:Find and replace multiple substitution using regex in Notepad++在 Notepad++ 中使用正则表达式查找和替换多个替换
【发布时间】: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 个空格。)
  • 可能是(?&lt;!\S) {4}(\S) {4}(?!\S) -> &lt;3spaces&gt;$1&lt;3spaces&gt;
  • 感谢 Adam 的提议,但由于注释字段也可以是空格字符,正如我所指出的,这些将不匹配。此外,如果我允许这 9 个空格匹配而不考虑该行的其余部分,则其他空格字符串将匹配并被全部替换。
  • 对不起,我的意思是感谢 Wiktor。
  • 另外,由于亚当编辑了我的问题,显示的格式不再代表我所面临的文本文件。

标签: regex notepad++


【解决方案1】:

你的问题有点不清楚,但这让我明白了:

 ([^ ]) 
\1

注意括号前有一个空格,括号后有一个。这将删除每个非空格字符之前和之后的一个空格。它忽略了 26,因为它们是两个非空格字符,所以替换所有作品。

【讨论】:

  • 谢谢加里。但是我需要将 4 个空格字符、1 个字符(一个字母或一个空格)、4 个空格字符的序列替换为 3 个空格字符、1 个字符、3 个空格字符,只有当它出现在以 40 个空格字符开头的行中并且那么只有这样的序列才能在同一行上找到。由于亚当所做的编辑使其不连贯,我已恢复到我的帖子的原始版本。
  • @Julien 啊,我明白了。很高兴知道,现在有意义。我稍后再看看。
  • 你试过我的建议了吗?如果偏移行只有一个字符的单词,而好的行有2个,它仍然可以工作。
  • 如果没有,我建议您发布一个更大的文件 sn-p。
  • 正如你所建议的,我更新了我的问题以添加带有偏移量的文件的更大提取以及我期望的结果。
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 2015-01-11
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多