常规表达式合并了2行

时间:2019-01-18 02:34:52

标签: regex perl

我有2个制表符分隔的行(我用下面的→替换了制表符),如下所示:

Line1Word1→Line1 Words2→→Line1Word3→→→Line1 Words4
→→Line2Word1→→Line2 Words2→→

预期结果

Line1Word1→Line1 Words2→Line2Word1→Line1Word3→Line2 Words2→→Line1 Words4

通过在Excel中复制3行,很容易看到结果是什么

Display in Excel

Line1

Line1Word1  Line1 Words2        Line1Word3          Line1 Words4

对于这一行,我得到了

^(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)$

这将获得第1、2、4和7组。但是,我认为必须有一种更通用的方式来获取这些组,这些组将占任何数量的组。

Line2

Line2Words1     Line2 Words2        

我可以在上面为第2行做同样的事情。如果我不知道会有多少人或他们位于哪里,仍然需要以更优雅的方式获得团体的帮助。

结果

Line1Word1  Line1 Words2    Line2Words1 Line1Word3  Line2 Words2        Line1 Words4

在这里,我不知道如何结合上面两行中的组,如下所示:

 \1(from Line1)\t\2(from Line1)\t\1(from Line2)\t\4(from Line1)...

这些年来,我很少使用正则表达式,但是为此我尝试的一切都无济于事。 任何帮助将不胜感激。

请注意对Tripleee的回复:

数据格式如下:

我们将把它们称为Array1和Array2,而不是Line1和Line2,它们将包含多个Lines行,如上所述。两个数组将具有相同数量的行

如示例中所示:

Array1只能具有索引1、2、4和7,每行都有数据

Array2只能具有索引3和5,每行都有数据

在任何行的两个数组中都没有索引

但是,每次脚本运行时,数组可能在不同的索引中包含数据,而每次都有或多或少的索引

可以使用以下方式创建一个包含所有数据的变量,并用|分隔:

Row1Array1 | Row1Array2
Row2Array1 | Row2Array2
Row3Array1 | Row3Array2
...

或者可以通过其他任何方式来排列数据,这将有助于使用正则表达式。

1 个答案:

答案 0 :(得分:2)

您为什么要为此使用正则表达式?

@first = split('\t', $line1);
@second = split('\t', $line2);
die "Different length arrays" unless($#first == $#second);
@combined = map { $first[$_] || $second[$_] } [0..$#first];

如果两个数组都具有相同索引的值,那么您可以添加一个检查,以使其消失,但这会使优雅的map稍微复杂化。

如果您对使用正则表达式很感兴趣,并且可以将所有行并排对齐,那么基本上可以使用正则表达式。我会使用([^\t]*)而不是(.*?)来完全消除歧义。

s/^([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)$/$1\t$2\t$10\t$4\t$12\t\t$7/

其中$ 1 .. $ 7来自上半部分,$ 8 .. $ 14对应于第二个中的第一个字段到第七个字段(因此我们使用1-2-3 + 7 = 10-4-5 + 7 = 12-一无所有-7可获取所需字段)。