【问题标题】:Regular Expresions combine 2 lines正则表达式结合 2 行
【发布时间】:2019-01-18 14:16:38
【问题描述】:

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

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

预期结果

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

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

1号线

Line1Word1  Line1 Words2        Line1Word3          Line1 Words4

对于这条线我得到了

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

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

第2行

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
...

或者数据可以以任何其他有助于使用正则表达式的方式排列。

【问题讨论】:

  • 这不是对更复杂需求的一般描述。这是实际的问题。我得到了一个 \t(.*?)\t 来捕获组。当然,这不会捕获第一个或最后一个文本字符串,因为两端没有制表符。除此之外,我不知道如何从 Line2 中提取文本并替换为例如 \1(from Line1)\2(from Line1)\1(from Line2)\3(from Line1)...有什么想法吗?跨度>
  • 谢谢 Tiw,我已经修改了原帖以添加更多细节。希望现在更清楚,有人可以提供帮助

标签: regex perl


【解决方案1】:

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

@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 得到你想要的字段)。

【讨论】:

  • 最后一行被盗...^W 改编来自stackoverflow.com/questions/38345/…
  • 这将在 Filemaker 解决方案中实现,是的,它可以在它自己的脚本中完成,但是如果可能的话,我正在尝试使用正则表达式。如果按照我认为可以在正则表达式中实现的方式实现,这将有几个优点,也许它不能。至于具有相同索引值的两个数组,这不会发生,除了都是空的。
  • 抱歉,对 Filemaker 不熟悉。这可能是您应该添加到问题中的信息。也许您还应该展示您如何使用您拥有的正则表达式。
  • 我只是在回答您的问题:“您为什么要为此使用正则表达式?”,我不是在寻求有关如何在 Filemaker 中执行此操作的帮助。我的问题仍然是如何在正则表达式中做到这一点。我展示了如何使用上面“Line1”中的有限正则表达式。这是我得到的。谢谢
  • 正则表达式本身无法修改任何内容;正则表达式根本无法匹配或匹配单个字符串中的单个子字符串。如果你能告诉我们你是如何得到这两行的(你是从文件中读取连续的行吗?或者它们可以作为变量使用吗?如果有两行以上怎么办?)那么也许有人可以设计一些基于正则表达式的东西。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2021-02-14
  • 2015-01-14
相关资源
最近更新 更多