我有一些包含数据的大型文本文件,如下所示:
2.086
0.019
2.181
0.004
2.308
0.005
2.165
0.023
2.113
0.004
2.022
0.005
0.013
0.033
0.005
0.026
0.009
0.037
Run Code Online (Sandbox Code Playgroud)
我想选择每 13 行并将连续行相互交换,直到第 18 行。所需的输出应如下所示:
2.086
0.019
2.181
0.004
2.308
0.005
2.165
0.023
2.113
0.004
2.022
0.005
0.033
0.013
0.026
0.005
0.037
0.009
Run Code Online (Sandbox Code Playgroud)
我试图为这个操作构建一个合适的正则表达式,但不知道如何开始选择每 13 到 18 行!
编辑:经过评论和聊天讨论后,首先是解决方案。解释如下。
搜索:(([^\n]*\n){12})((?2))((?2))((?2))((?2))((?2))((?2))
代替:\1\4\3\6\5\8\7
解释
这里是选择 5 行的一般方法:
(?:[^\n]*\n){5}
Run Code Online (Sandbox Code Playgroud)
查看演示
选择[^\n]*\n
任意数量的非换行符,后跟换行符。我们这样做了 5 次。您可以添加锚点、环顾四周等来执行更多操作。
例如,此正则表达式将前 3 行与后 5 行交换:
\A((?:[^\n]*\n){3})((?:[^\n]*\n){5})
Run Code Online (Sandbox Code Playgroud)
这里要理解的关键是,行组被捕获到组 1 和组 2。这是通过将每个表达式括在捕获括号中来完成的。稍后,在替换中,如演示所示,可以通过编号来引用这些组,如下所示:\1
对于组 1,依此类推。
查看演示
你想瞄准13号线吗?第 12 场比赛,然后是 1 场比赛。您想对更多的线路进行一些操作吗?添加行,并根据需要切换捕获组。
\A((?:[^\n]*\n){12})((?:[^\n]*\n))((?:[^\n]*\n){2})
Run Code Online (Sandbox Code Playgroud)
在此示例中,第一组括号捕获 12 行,下一组括号捕获第 13 行,下一组括号捕获接下来的两行。您可以通过重新排列替换中的组来切换第 13 行和以下两行:\1\3\2
您想在一个文件中多次执行此操作吗?不要抛锚。这是一个演示,每 5 行与第 6 行和第 7 行交换。
只需根据您的需要进行调整即可。
编辑
根据您的评论,这应该完全符合您的需要。
搜索:((?:[^\n]*\n){12})((?:[^\n]*\n))((?2))((?2))((?2))((?2))((?2))
代替:\1\3\2\5\4\7\6
同样的想法。这((?2))
是一种避免一遍又一遍重复相同正则表达式的方法(第二组捕获括号,捕获一行)。(?2)
表示“重复第 2 组中的表达式”,额外的括号将这些表达式放入第 3、4、5、6、7 组中。
归档时间: |
|
查看次数: |
5528 次 |
最近记录: |