2013-08-29 43 views
1

我使用正则表达式,使用此代码:正则表达式:反向引用一个可选的分组

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

什么我要为是解析基本的元数据,像这样:

标题:标题部分一本书或其他东西

除了一些行在他们周围有**,其他人没有。问题是<value>下的一些项目跨越多行,所以我不能做?<value>.*?。基本上,我需要第二个<ast>分组,当且仅当第一个<ast>分组存在。

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

*(这是一个词对降价的转换,还有一些线路进行了加粗。)

编辑:解

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>(?:\\\*\\\*)?) 

and re移动最后的“?”最后。

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

+0

嗯,这似乎并不适合我......在编辑中发布结果。谢谢您的帮助。 – acsmith

+0

接受答案,因为它实际上是我的问题的解决方案。只需要修复一个愚蠢的错误(忘记在双引号内跳过) – acsmith

相关问题