2

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

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

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

标题:一本书或某事的一些标题

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

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

*(这是 Word 到 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
4

1 回答 1

1

代替:

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

和:

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

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

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

于 2013-08-29T08:36:03.787 回答