如何使用regexp从markdown中选择部分文本?

时间:2017-03-08 20:34:41

标签: regex

我有下一个文字:

#Header
my header text

##SubHeader
my sub header text

###Sub3Header
my sub 3 text

#Header2
my header2 text

我需要选择“#Header”中的文字到“#Header2”。

我试着写了regexp:http://regexr.com/3ffva,但它与我需要的不匹配。

3 个答案:

答案 0 :(得分:1)

^#[^#\n]+([\W\w]*?)^#[^#\n]+

基本思路:找到第一级-1标题,找到任何文本直到 ......第二级-1标题。

  • ^#[^#\n]+第一级-1标题
    • ^行首(由于多行标志)
    • [^#\n]+任何不是#或换行符的字符。重复一次或多次。
  • ([\W\w]*?)任何文字,直到下一个匹配的部分
  • ^#[^#\n]+第二级-1标题(见上文)

标志:多线。

答案 1 :(得分:0)

在下一个标题之前展望关闭捕获和匹配:

1-没有多行标志

(^|\n)#([^#]+?)\n([^]+?)(?=\n#[^#]|$)

Demo without multi-line flag

说明

  • 第1组首先捕获#后面的字符串或新行,而没有其他#,这意味着新的标题从那里开始。

  • 第2组捕获标题

  • 第3组捕获任何东西直到下一个标题或结尾

  • 第4组是非捕获的,展望新标题或文本结尾。

2-带有多行标志

^#([^#]+?)\n([^]+?)(?=^#[^#])

Demo with Multi-line flag

说明

  • 首先,在文本末尾添加#--,以便通过此正则表达式匹配最后一个标题!

  • 从第^行的第一个字符开始匹配,并在标题文本中匹配#而不包含#。在\n

  • 之前捕获了第1组:标题
  • 第2组捕获文本直到下一个标题开始,在起始行只有一个#。

答案 2 :(得分:0)

根据您的正则表达风格,您可以使用:

(^#{1}.+)(.*\n)*

如下所示:http://regexr.com/3fg08

或者,您可以使用Vim非常神奇的模式:

\v(^#{1}.+)(.*\n)*(^#{1}\w+)