2013-08-29 5 views
1

Я использую регулярные выражения, с помощью этого кода: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 

ответ

0

Заменить:

(?<ast>\\\*\\\*)? 

С:

(?<ast>(?:\\\*\\\*)?) 

И повторно переместить окончательный "?" в конце.

Это заставит первую группу захвата существовать, даже если она ничего не соответствует.

+0

Хм, это не работает для меня ... публикация результатов в редактировании. Спасибо за помощь. – acsmith

+0

Принял ответ, потому что он на самом деле был решением моего вопроса. Просто нужно было исправить тупую ошибку (забыв избежать \ внутри двойных кавычек) – acsmith

Смежные вопросы