У меня есть текстовый файл, отформатированный таким образом: (<s>=space character, <t>=tab character, <n>=end line)

1<s><t>some text<s><t>translated text<s><t>some comment<n>
2<s><t>some text<s><t>translated text<n>
3<s><t>some text<s><t>translated text<s><t>some comment<s><t>another comment<n>
4<s><t>some text<s><t>translated text<s><t>some comment<n>
5<s><t>some text<s><t>translated text<n>
6<s><t>some text<s><t>translated text<n>
.
.

Как видите, в одних строках есть комментарии, а в других - нет. Мне нужно сгруппировать номер строки, а также единственный текст, переведенный с использованием регулярного выражения perl. У меня проблемы с игнорированием оставшейся части строки после «переведенного текста». Пробовал две версии:

/^(\d+)\s+(?:[^\t]+)\t(.+)(\t|$)/gm

  • это регулярное выражение работает, если нет комментариев, но оно не отделяет перевод от комментариев в других строках.

/^(\d+)\s+(?:[^\t]+)\t([^\t]+)/gm

  • это регулярное выражение работает со строками, которые имеют комментарии, но не для других, поскольку оно останавливается на первой вкладке следующей строки

Заранее благодарю за ответы

-2
jak 18 Ноя 2019 в 12:10
Что вы пробовали? Какие у тебя проблемы? Пожалуйста, покажите нам свой код.
 – 
Dave Cross
18 Ноя 2019 в 12:53
Пожалуйста, не добавляйте подобную полезную информацию в комментарии. Вместо этого отредактируйте свой вопрос и добавьте его туда.
 – 
Dave Cross
18 Ноя 2019 в 19:49
PS: Я пробую эти регулярные выражения с помощью онлайн-тестера регулярных выражений.
 – 
jak
18 Ноя 2019 в 19:50

2 ответа

Удалите третью вкладку и все последующее:

 $line =~ s/^(?:[^\t]*\t){2}[^\t]*\K\t[^\n]*//;
1
ikegami 18 Ноя 2019 в 20:00
Если нет комментариев - нет даже третьей вкладки :(
 – 
jak
18 Ноя 2019 в 20:32
Что ты думаешь? Почему такое грустное лицо?
 – 
ikegami
18 Ноя 2019 в 21:56
В вашем примере выполняется поиск 2 раза 0 или более символов без табуляции и табуляции (в моем примере текст: «номер строки» + «некоторый текст»), затем снова выполняется поиск 0 или более символов без табуляции («переведено текст ") и сбросить (\ K). Теперь продолжайте поиск «вкладки» (третья «вкладка»), но если строка закончена («некоторый комментарий» опущен), «вкладки» нет, и ваш пример в этом случае не работает. Хотелось бы, чтобы он работал как тогда, когда есть «какой-то комментарий», так и когда его нет.
 – 
jak
19 Ноя 2019 в 01:57
Это не совпадает, если это не третья вкладка, но это нормально, потому что нечего удалять или третьей вкладки нет. Так что это работает
 – 
ikegami
19 Ноя 2019 в 09:41

Это регулярное выражение выполняет ожидаемую работу:

/^((?>\d+))(?:(?>\s+))(?>[^\t]+)\t((?>[^\t\n]+))/gm
0
jak 19 Ноя 2019 в 02:47