Регулярные выражения объединяют 2 строки - PullRequest
0 голосов
/ 18 января 2019

У меня есть 2 строки с разделителями (я заменил вкладки → ниже), как в:

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

Ожидаемый результат

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

Легко увидеть, каким должен быть результат, скопировав 3 строки в Excel

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

Здесь я не имею представления о том, как объединить группы из 2 строк выше, как в:

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

Я годами использовал регулярные выражения, но все, что я пытался для этого, ни к чему не привело. Любая помощь будет принята с благодарностью.

ПРИМЕЧАНИЕ в ответ на Tripleee:

Данные форматируются следующим образом:

Вместо Line1 и Line2 мы будем называть их Array1 и Array2, которые будут содержать несколько строк, строк, как описано выше. Оба массива будут иметь одинаковое количество строк

Как в примере:

Массив1 может иметь только индексы 1, 2, 4 и 7 с данными в каждой строке

Массив2 может иметь только индексы 3 и 5 с данными в каждой строке

Ни в одном индексе не будет данных в обоих массивах в любой строке

Однако массивы могут иметь данные в разных индексах каждый раз, когда выполняется скрипт, с большим или меньшим количеством индексов каждый раз

Переменная, содержащая ВСЕ данные, разделенные |, может быть создана следующим образом:

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

Или данные могут быть расположены любым другим способом, который поможет использовать регулярные выражения.

1 Ответ

0 голосов
/ 18 января 2019

Почему вы вообще используете для этого регулярное выражение?

@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, чтобы получить нужные поля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...