正则表达式,用于匹配 Markdown 标题和嵌套在特定标题下的文本

Regex to match markdown headings and text nested under specific heading

提问人:lukaskupfing 提问时间:9/29/2023 最后编辑:Trenton McKinneylukaskupfing 更新时间:9/30/2023 访问量:94

问:

我正在将 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

我需要一个匹配所有并嵌套在 .在这里应该起到一种开关的作用。所有,并且应与捕获组匹配。因此,嵌套在下面的内容不应匹配。因此,匹配的文本应为:## HeadingsText of Headings# Heading ⤵## HeadingsText 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

JavaScript 正则表达式 黑曜石

评论

0赞 The fourth bird 9/29/2023
喜欢这个?regex101.com/r/fBXTJO/1
0赞 lukaskupfing 9/29/2023
嵌套在下面的标题和文本(因此没有“⤵'”的标题)也像这样匹配。只有 after after 直到下一个 or 应该匹配的内容# Heading 2# Heading ⤵# Heading# Heading ⤵
1赞 The fourth bird 9/29/2023
然后也许像这样 regex101.com/r/r7CdRM/1
0赞 lukaskupfing 9/29/2023
这看起来很有希望!唯一的问题是,进一步的嵌套标题不匹配(参见正则表达式)。这个正则表达式似乎非常适合我,非常感谢!你能解释一下RegExp吗?我不完全明白发生了什么### Heading
0赞 The fourth bird 9/29/2023
我发布了略微修改的图案,不匹配或# ##

答:

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.1Heading 1 > Heading 1.1Heading 1Heading 1.2Heading 1 > Heading 1.1
0赞 The fourth bird 9/30/2023
@lukaskupfing我真的不知道为什么会这样。如果您为第一个捕获组引入另一个捕获组,会发生什么 regex101.com/r/X6ufDy/1# Heading 1
0赞 lukaskupfing 9/30/2023
经过一番测试,我发现问题出在第二个。删除它解决了问题,其余的仍在工作:regex101.com/r/gffV2P/1\n
0赞 The fourth bird 9/30/2023
@lukaskupfing 很高兴听到它正在工作!