[ID CC-CC2021] Правильно выделить GREP`ом заголовки из markdown

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Здравствуйте.
Здоровья вам и дорогим вам людям.


Посоветуйте правильно выделить GREP`ом заголовки из markdown

Сейчас использую вид
Код:
    #                                   ^#{1,1}(?=\s)(.+?)($)
    ##                                  ^#{2,2}(?=\s)(.+?)($)
    ###                                 ^#{3,3}(?=\s)(.+?)($)
    ####                                ^#{4,4}(?=\s)(.+?)($)

Но, есть два вопроса:

- 1. "вообщем" - работе, но правильно ли GREP написал =) ?

- 2. Как только забыл поставить пробел после ### - кирдык, выделения не будет ( ###Маруся )
- - Опечатки возможны, а дополнительная перепроверка документа markdown на пробел после ## - не гуд
- - Решить вопрос самостоятельно не смог.


Всем откликнувшимся спасибо!
 

NNN5

Модератор
15 лет на форуме
Сообщения
1 256
Реакции
1 012
Что-то вас трудно понять. Попробуйте рассказать другими слова.
 
  • Спасибо
Реакции: blacksolg

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Сейчас использую вид
А зачем сложности типа positive lookahead, если можно просто проверять наличие любого количества пробелов между тегом и текстом?
^(#{3})(\s*)(.+)$
В третьей группе всегда будет текст без пробельных символов в начале. Можно добавить ту же группу в конце - и убрать лишние пробелы перед концом строки.
 
Последнее редактирование:
  • Спасибо
Реакции: blacksolg

К.Т.

Участник
Сообщения
324
Реакции
337
Если символ # не встречается в теле заголовков (а скорее всего это так), то:
^#{2}[^#]+$
 
  • Спасибо
Реакции: blacksolg

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Что-то вас трудно понять. Попробуйте рассказать другими слова.
Ок. Извините что не понятно =(

1. Имеем заголовки, добавленные из документа markdown
# Алиса
## Бобик
### Рыжик
#### Маруся
...

2. Их нужно искать по GREP каждый заголовок, используя маркировку markdown # ## ###
Далее присваивание каждому отдельные(!) стили абзаца

3. "Моими изысканиями" ^#{2,2}(?=\s)(.+?)($) можно выделить ## Бобик

4. Но если текст содержит ##Бобик (то есть без пробела)
выделения не происходит = плохо, тк ошибиться и НЕ поставить пробел после # можно

5. Написать GREP запрос, в котором выделяются абзацы строго по ## не выделяя при этом абзацы ### #### #####...
у меня получается только по отбивке-символу/маркеру в виде пробела ( \s )

6.
Другого решения "как пробел" не придумал.
Поиск гугла тоже не помог.
Решил обратиться к вам:
- правильно ли вообще написал "вариант с пробелом"?
- как реализовать GREP что бы работал и при отсутствие пробела, но выделял строго ## а не цеплял еще ### ####...
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
А зачем сложности типа positive lookahead, если можно просто проверять наличие любого количества пробелов между тегом и текстом?
^(#{3})(\s*)(.+)$
В третьей группе всегда будет текст без пробельных символов в начале. Можно добавить ту же группу в конце - и убрать лишние пробелы перед концом строки.
Спасибо.
Но ваш пример ^(#{3})(\s*)(.+)$ последовательно выбирает
### Рыжик
и
#### Маруся

а нужно отдельно
один запрос - один вариант из # # ### ####...
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Если символ # не встречается в теле заголовков (а скорее всего это так), то:
^#{2}[^#]+$
Ух!
Походу Ваш пример ^#{2}[^#]+$ - работает, и то что нужно
Выделят только заголовки (по факту абзац) только начинающиеся с ##

С пробелом/без пробела

# Алиса
## Бобик
### Рыжик
#### Маруся

#Алиса
##Бобик
###Рыжик
####Маруся

Только вот знаний не хватает, понять, что делает [^#]
символ корректурной вставки (^) для знака #
- если не сложно, можете рассказать-научить?
- спасибо


PS
Простите за наглость:
+$ - так правильней писать
чем как у меня: ($)
 

К.Т.

Участник
Сообщения
324
Реакции
337
Символ ^ сразу после открывающей квадратной скобки означает "любой кроме следующих", то есть [^#] означает "любой кроме #".
Символ + относится к предыдущему и означает "в количестве один или более", то есть смысловой блок [^#]+.
 
Последнее редактирование:
  • Спасибо
Реакции: blacksolg

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Последнее редактирование:
  • Спасибо
Реакции: Masia и blacksolg

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168

Тут есть скрипты для импорта маркдауна, если что
 
  • Спасибо
Реакции: blacksolg

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Символ ^ сразу после открывающей квадратной скобки означает "любой кроме следующих", то есть [^#] означает "любой кроме #".
Символ + относится к предыдущему и означает "в количестве один или более", то есть смысловой блок [^#]+.
Не знал.
Спасибо!
Идеально!
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Отставить, надо править.
Спасибо за ваше участие и помощь!
Но открыв ссылку, увидел пульт кабины управления авиолайнером =))
Regex - что-то слышал, и не более =))). Уж что там на сайте по ссылке вообще не понял )
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7

Тут есть скрипты для импорта маркдауна, если что
Спасибо за внимание и участие.


Да, знакомый сайт. Любой запрос GREP + markdown ведет на него.

Скрпиты видел, но подробно не изучал. - Пока не хватает времени.
Да и возможно, скорее всего, некоторые спецефичные метки и выделения в моих работах/программ могут не отработать,
тогда придется править-настраивать сам скрипт уже. Так что GREP + помощь данного форума, отзывчивых людей, гугла.
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Символ ^ сразу после открывающей квадратной скобки означает "любой кроме следующих", то есть [^#] означает "любой кроме #".
Символ + относится к предыдущему и означает "в количестве один или более", то есть смысловой блок [^#]+.

Возникла проблема:

Ваш пример: ^#{3}[^#]+$
При тестах на тексте:
Код:
# Алиса
## Бобик
### Рыжик


#Алиса
##Бобик
###Рыжик


Текст Текст Текст Текст
Текст Текст Текст Текст

Текст Текст Текст Текст
Текст Текст Текст Текст

начинает захватывать-выделять
1. ### Рыжик +пустую строку после него (те след. абзац)
2. ###Рыжик +пустую строку +2 строки текста +пустую строку после текста +пустую строку + снова текст....
и так до пустой строки и новый заголовок с началом #

=(
пробовал переписать на
^#{3}[^#]+($)
^#{3}[^#]+\r
^#{3}[^#]+(\r)
^#{3}[^#]+(.+?)$ (еще хуже-больше захват пошел)
^(#{3}[^#]+)$

- не помогло.
- пока не понимаю как исправить ситуацию..
- помогите пожалуйста.
 
Последнее редактирование:

К.Т.

Участник
Сообщения
324
Реакции
337
Тогда так: ^#{3}[^#]+?$

Выражение +? означает нежадный захват, т.е. минимально возможный, поэтому лишние \r не будут захватываться.
(Голый + означает жадный захват, т.е. максимально возможный).

А ещё можно так: ^#{3}[^#\r]+.
 
Последнее редактирование:
  • Спасибо
Реакции: blacksolg

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Есть мнение, что не нужно впихивать в одно выражение оба случая. Два простых выражения прекрасно отработают любые сочетания.
JavaScript:
^(#{3})(\s)(.+)$
^(#{3})([^\s#]+)$
В пером случае группа 3, во втором группа 2
 
  • Спасибо
Реакции: blacksolg

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Тогда так: ^#{3}[^#]+?$

Выражение +? означает нежадный захват, т.е. минимально возможный, поэтому лишние \r не будут захватываться.
(Голый + означает жадный захват, т.е. максимально возможный).

А ещё можно так: ^#{3}[^#\r]+.
Спасибо вам человек!
И отдельное, спасибо, за то что сразу разъяснили "что от чего"

По поводу варианта 2:
пока для себя не понял, в чем разница между
\r - Конец абзаца
$ - Конец абзаца [расположение]

Выбираю по умолчанию $ потому как визуально в запросе GREP смотрится более чисто и понятно.
* - Если у вас есть желание, можете подсказать, в чём разница "концовок абзаца" в рамках данного топика? Спасибо.
 

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
Есть мнение, что не нужно впихивать в одно выражение оба случая. Два простых выражения прекрасно отработают любые сочетания.
JavaScript:
^(#{3})(\s)(.+)$
^(#{3})([^\s#]+)$
В пером случае группа 3, во втором группа 2
Спасибо.

Согласен:
1. чем чище и проще код - тем и работать с ним легче
2. нагрузка на анализ меньше, ложных срабатываний - разделяй и властвуй

Но при условии что заголовков уже 6шт,
плюс есть дополнительные схожие запросы (маркер в начале выделяемого абзаца)
то помножив все на х2, получится может 20-30 запросов против 10-15
а еще другие условия...

Понятное дело планируется использовать скрипт последовательного запуска GREP запросов для присвоения стилей
Но да же с ним, уже будет наверно тяжело ореинтироваться в списках и последовательностях на обработку по всему документу.
 

К.Т.

Участник
Сообщения
324
Реакции
337
\r соответствует самому символу конца абзаца.
$ не соответствует никакому символу, а обозначает позицию перед завершением, которым может быть не только символ конца абзаца, но и перевод строки, конец текста или табличной ячейки.
Соответственно, в разных ситуациях они сработают по-разному.
 
  • Спасибо
Реакции: blacksolg

blacksolg

Участник
Топикстартер
Сообщения
249
Реакции
7
\r соответствует самому символу конца абзаца.
$ не соответствует никакому символу, а обозначает позицию перед завершением, которым может быть не только символ конца абзаца, но и перевод строки, конец текста или табличной ячейки.
Соответственно, в разных ситуациях они сработают по-разному.
Спасибо.
Разницу понял.
Применение пока нет - время может научит.

Еще раз спасибо =)