parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Помогите с регуляркой - по идее чистый rsplit-вариант (но ни rsplit, ни свой вариант не работают)

@chusov 21.08.2021 17:54 / 21.08.2021 18:02

Задача:
есть некий текстовый формат файла нижеследующего вида.

1) первая строка всегда начинается с "---"

2) каждая отдельная полезная запись предваряется ">" с начала строки

3) или "->" или "-->" и т.д.
дефисы в кол-ве (0 или более) служат для уровня,
но нам на него пофигу, нам надо просто забрать все тела записей
(т.е. всё что после ">" и до сл.границы другой записи)

4) тело записи может быть многострочно, т.е. в примере ниже
line4
still line4 content
это отдельная запись (с сохранением всех переносов)

5) а также пустые записи (типа последние 3 строки), тоже нужно посчитать
т.е. чтобы попали в виде пустых строк в общую match-таблицу

6) Собственно рабочий пример файла:
---
>line
->line2
-->line3
--->line4
still line4 content
>
>
->
Скажу сразу, я пробовал разные отладчики regexp-ов, но при переключении PCRE, PCRE2, Python, ECMA,... они выдают порой разные результаты, при том, что я далеко не уходил каких-то наворотах. Это говорит, что есть поведение (особенно с жадностью) которое я не понимаю.
Моя логика была следующей:
Коль скоро первая линия "---" нам не нужна (а она всегда есть),
то признак начала записи упрощается до
(символ_конца_строки) + (дефис 0 или более) + (>)

А дальше всё что угодно, только не результат :)

$txt[---
>line
->line2
-->line3
--->line4
still line4 content
>
>
->
]

# и так я пробовал но тут жадность вторых скобок съедает все последующее
$tab[^txt.match[(\n-*>)(.*)][g]]

# а так оно не работает (тут похоже как будто ? вообще не работает на жадность)
# т.к. он по одному символу приносит, т.е. синтаксис ? в других случаях) 
$tab[^txt.match[(\n-*>)(.*?)][g]]

# думал может вот так жадность пристроить, но нет
$tab[^txt.match[((\n-*>)(.*)?)][g]]

# отчаялся, решил, что ок, пусть "---" тоже войдет в match
# и я задействую работающую регулярку из rsplit, только поменяю .+ на .*
$sRegex[\n-*>]
$tab[^t3g-text.match[(.*?)(?:$sRegex|^$)][g]]

как бы... да но, оно выдает доп.паразитную пустую строку в $tab
(в конце видимо)

т.е. в $tab должно (вкупе с "---") попасть 8 строк, а там 9 
В итоге вопроса два:
1) Как правильно (когда delimiter не "между", а всегда "перед") и почему у меня не выходит сделать шаблон с "предваряющим" разделителем.

2) Откуда доп.пустой match в rsplit-результате

Спасибо.