使用正则表达式更改列的顺序

时间:2013-05-23 10:40:33

标签: regex

我有以下列:

9   100 100 0
            10
            20
            30
        110 0
            10
            20
            30
        120 0
            10
            20
            30
    120 100 0
            10
            20
            30

我想颠倒列的顺序,如:

\3\2\1\0

这就是我尝试获取一列的方法:

(\t?|\d+)

对我来说这是有意义的,但它不起作用,有没有人看到错误?

之后它假设它正在重复:

(\t?|\d+)(\t?|\d+)(\t?|\d+)(\t?|\d+)

接下来:

\3\2\1\0

有人可以帮我修理吗?

2 个答案:

答案 0 :(得分:4)

尝试

^(\d*)\t(\d*\t)(\d*\t)(\d*)$

并将其替换为:

\4\t\3\2\1

(未经测试,但感觉正确)

如果有其他空格而不是制表符,则可能需要相应地修改正则表达式。

答案 1 :(得分:0)

包含列的示例文本不包含任何选项卡。所以这里有一个解决方案,允许使用空格和制表符来分隔列:

^(\d*)([ \t]+)(\d*)([ \t]+)(\d*)([ \t]+)(\d+)$

下一个正则表达式与上面的正则表达式相同,但效率更高一些。它也不太容易阅读。

^[ \t]*(?:(\d+)([ \t]+))?(?:(\d+)([ \t]+))?(?:(\d+)([ \t]+))?(\d+)$

它有7个捕获组。组1,3,5,7是列值,组2,4,6是列分隔符。

你的替换表达式应该是这样的,它实质上颠倒了一切:

\7\6\5\4\3\2\1

如果您想修复分隔符并改为使用制表符,您可以使用类似的东西作为替换表达式:

\7\t\5\t\3\t\1