正则表达式:反向引用可选的分组

时间:2013-08-29 08:12:12

标签: ruby regex

我正在使用正则表达式,使用以下代码:

Regexp.new("^(?<ast>\\\*\\\*)?(?<key>#{@meta_types.join("|")}):(?<value>.*)\\k<ast>?$", Regexp::MULTILINE)

我想要的是解析基本元数据,如下所示:

标题:书籍的某些标题

除此之外,有些线路周围有**,而其他线路没有。问题是<value>下的某些项目跨越多行,因此我无法执行?<value>.*?。基本上,当且仅当存在第一个<ast>分组时,我才需要第二个<ast>分组。

有没有办法做到这一点,或者某人有更好的解决方案?

*(这是一个Word-to-Markdown转换,有些行是粗体。)

编辑:解决方案

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

1 个答案:

答案 0 :(得分:0)

替换:

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

使用:

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

并删除最后的“?”最后。

这将强制第一个捕获组存在,即使它不匹配。