Я использую регулярные выражения, с помощью этого кода:Regexp: обратная ссылка необязательной группировка
Regexp.new("^(?<ast>\\\*\\\*)?(?<key>#{@meta_types.join("|")}):(?<value>.*)\\k<ast>?$", Regexp::MULTILINE)
Что я собираюсь для разбора это основные метаданных, как так:
Названия: Некоторое название книги или чего-то еще
Кроме того, некоторые из них имеют ** вокруг них, а другие нет. Проблема в том, что некоторые элементы под <value>
охватывают несколько строк, поэтому я не могу сделать ?<value>.*?
. По сути, мне нужно потребовать вторую группу <ast>
тогда и только тогда, когда есть первая группа <ast>
.
Есть ли способ сделать это, или у кого-то есть лучшее решение?
* (Это слово-в-Markdown преобразования, и некоторые из линий были выделены жирным шрифтом.)
Edit: решение
r = Regexp.new("(?<ast>(?:\\\*\\\*)?)(?<key>Title):(?<value>[^\*]*)\k<ast>", Regexp::MULTILINE)
s = "**Title: Some pieces of text with a random\nnewline thrown in for good measure**\n"
r.match s
Хм, это не работает для меня ... публикация результатов в редактировании. Спасибо за помощь. – acsmith
Принял ответ, потому что он на самом деле был решением моего вопроса. Просто нужно было исправить тупую ошибку (забыв избежать \ внутри двойных кавычек) – acsmith