提问人:lukaskupfing 提问时间:9/29/2023 最后编辑:Trenton McKinneylukaskupfing 更新时间:9/30/2023 访问量:94
正则表达式,用于匹配 Markdown 标题和嵌套在特定标题下的文本
Regex to match markdown headings and text nested under specific heading
问:
我正在将 Obsidian(使用 ECMAScript)与 Obsidian_to_Anki-Plugin 一起使用,并且我有这个页面结构:
# Heading 1 ⤵
## Heading 1.1
Text of Heading 1.1
Text can span over multiple lines
Even more text
## Heading 1.2
Text of Heading 1.2
# Heading 2
## Heading 2.1
Text of Heading 2.1
## Heading 2.2
Text of Heading 2.2
# Heading 3 ⤵
## Heading 3.1
Text of Heading 3.1
## Heading 3.2
Text of Heading 3.2
# Heading 4
我需要一个匹配所有并嵌套在 .在这里应该起到一种开关的作用。所有,并且应与捕获组匹配。因此,嵌套在下面的内容不应匹配。因此,匹配的文本应为:## Headings
Text of Headings
# Heading ⤵
⤵
## Headings
Text of headings
# Heading
⤵
## Heading 1.1
Text of Heading 1.1
More text
Even more text
## Heading 1.2
Text of Heading 1.2
## Heading 3.1
Text of Heading 3.1
## Heading 3.2
Text of Heading 3.2
这是我想出的 regex101。我的问题是,这样只有第一个匹配,我找不到解决方案。## headings and texts
答:
2赞
The fourth bird
9/29/2023
#1
您可以使用:
(?<=^# .*⤵(?:\n(?!# ).*)*)\n(^## .*)\n(?!^##? )(.*(?:\n(?!^##? ).*)*)
该模式匹配:
(?<=
正面向后看,断言向左是^# .*⤵
匹配和行的其余部分结束#
⤵
(?:\n(?!# ).*)*
(可选)匹配所有不以 1+ 字符和空格开头的行#
\n
匹配换行符
)
关闭 lookbehind(^## .*)
捕获第 1 组,匹配后跟该行的其余部分##
\n
匹配换行符(?!^##? )
否定展望,断言该行不以 # 或 ## 开头,并带有空格(
捕获组 2.*
匹配整线(?:\n(?!^##? ).*)*
(可选)匹配所有不以 # 或 ## 开头的行以及空格
)
关闭组 2
评论
0赞
lukaskupfing
9/30/2023
使用 Obsidian 测试 RegExp 后,我遇到了一个小问题。Obsidian_to_Anki插件具有自动上下文功能(我需要)。上下文函数告诉您,标题是否在文本中。因此,例如,它应该是 ,而您的 RegExp 将其更改为 only .因为它改为 .所以它基本上是错误地向上移动了一个位置。这能以某种方式解决吗?Heading 1.1
Heading 1 > Heading 1.1
Heading 1
Heading 1.2
Heading 1 > Heading 1.1
0赞
The fourth bird
9/30/2023
@lukaskupfing我真的不知道为什么会这样。如果您为第一个捕获组引入另一个捕获组,会发生什么 regex101.com/r/X6ufDy/1# Heading 1
0赞
The fourth bird
9/30/2023
@lukaskupfing 很高兴听到它正在工作!
评论
# Heading 2
# Heading ⤵
# Heading
# Heading ⤵
### Heading
#
##