我有2个制表符分隔的行(我用下面的→替换了制表符),如下所示:
Line1Word1→Line1 Words2→→Line1Word3→→→Line1 Words4
→→Line2Word1→→Line2 Words2→→
预期结果
Line1Word1→Line1 Words2→Line2Word1→Line1Word3→Line2 Words2→→Line1 Words4
通过在Excel中复制3行,很容易看到结果是什么
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
...
或者可以通过其他任何方式来排列数据,这将有助于使用正则表达式。
答案 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可获取所需字段)。