Ruby on rails Regexp获取两个标记头/节之间的内容

Ruby on rails Regexp获取两个标记头/节之间的内容,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我试图在两个标记头之间获取内容,第二个定界头是可选的。我希望regexp能够支持所有类型的头文件,例如 ### Thing # Thing # Thing ===== 基于此,我到目前为止已经有了(假设我想获取标题为“Stuff”的标题的所有内容): 但是捕获组正在返回一个空字符串()。对于以下情况,解决方案应能够返回“我的内容”: ## Stuff my content 二, 三, 四, 如果结果中有额外的新行或空格,则可以。这是假设我想要获取的内容中没有子标题。正则表达式中的第一个问

我试图在两个标记头之间获取内容,第二个定界头是可选的。我希望regexp能够支持所有类型的头文件,例如

### Thing

# Thing #

Thing
=====
基于此,我到目前为止已经有了(假设我想获取标题为“Stuff”的标题的所有内容):

但是捕获组正在返回一个空字符串()。对于以下情况,解决方案应能够返回“我的内容”:

## Stuff
my content
二,

三,

四,


如果结果中有额外的新行或空格,则可以。这是假设我想要获取的内容中没有子标题。

正则表达式中的第一个问题是“下一个标题检测器”(
(?:^\s*.\s*\w+.*\n(?:\s*[-=]*\s*\n)?\124;\ z)
)将匹配“`!因此,它匹配标题后面的第一个空字符串(因为组捕获是非贪婪的),并将捕获保留为空。第二个问题是,您只匹配以表单“Stuff”开头的标题
#东西
,而不是模式

Stuff
=====
最后,由于捕获了下一个标题,因此无法正确处理连续的“填充”标题

下面是修复正则表达式的建议:
^(?\s*#+\s*东西。*|\s*东西。*\n\s*(?:-{2,}}}={2,}))\n(?[\W\W]*?)(?=^(?:\s*#+|。*\n\s*(?:-{2,}}}}={2,}\s*\n))\z


请注意,Ruby并不完全是PCRE,因此它的制作更精确,尽管它的用户友好性不如

也许可以尝试一下。基本上,您正在匹配组,但没有捕获组与
(?:…)
注意:为了清晰起见,我创建了“标题”组和“内容”组,但您可能希望删除名称(并使“标题”不捕获),以恢复您的原始行为。答案非常棒!非常感谢您告诉我哪里出了问题,关于使用Rubular的提示,以及您伟大的解决方案。从你的帖子中了解了一些关于regex的新东西,这些东西将来会派上用场。
# Stuff #
my content
# Thing
texty text

#Stuff
my content

# Other thing
Stuff
====
my content
Stuff
=====