在markdown中匹配标头

时间:2017-05-10 08:01:10

标签: regex powershell markdown

我尝试创建一个解析markdown文件并返回目录的函数。 toc将对markdown文件中的特定标头进行动态引用。

我目前正试图找出如何正确匹配标题。

我的example.md:

$atxMatcher = '(^\s*(?<ATXlayer>#+)\s*(?<ATXname>.+)$)'
$setexMatcher = '\s*(?<setexname>[\w|\d\s]+)\n(?<setexLayer>[-|=]+)\n'
$regexString = '(^\s*(?<atxlayer>#+)\s*(?<atxname>.+)$)|(^\s*(?<setexname>[\w|\d\s]+)\n(?<setexLayer>[-|=]+)$)'

RegEx-Strings我到目前为止尝试过:

select-string

我认为最好的机会是Foreach-Object$matches.SetexLayer = '============================' $matches.SetexHeader = 'Setex-Header layer 1' $matches.SetexLayer = '----------------------------' $matches.SetexHeader = 'Setex-Header layer 2' $matches.atxLayer = '###' $matches.atxHeader = 'Atx-Header layer 3' $matches.atxLayer = '####' $matches.atxHeader = 'Atx-Header layer 4'

如果我将文件内容作为字符串传入,

Select-String可能会起作用。但我无法弄清楚正确的正则表达式字符串以匹配标题。

Foreach-Object可以工作,但是如果我也想处理setex-headers,它需要更多逻辑,因为它们是多线的。

预期结果应该是

:checked

有关如何制作该正则表达式字符串的任何想法吗?

1 个答案:

答案 0 :(得分:1)

我找到了correct regex-string

'((?<atxlayer>#+)\s*(?<atxname>.+))|((?<setexname>[\w|\d|\s|-]+)\n(?<setexLayer>[-|=]{2,}))'匹配我想要的所有附件。

我会告诉你这个功能的最新消息,也许它会派上用场。

我想,我将拆分md以排除受防护的代码块。

更新1

好的,我重做了字符串,因为它不如我最初那么好。

现在我有(?<name>[^\n\r]+)\n(?<Layer>[-|=]{2,})$|^((?<layer>#{1,6})\s*(?<name>.+))$

#Setex-Section
(?<name>[^\n\r]+) #everything but linebreak and carriage return
\n #linebreak
(?<Layer>[-|=]{2,})$ #---- or ==== and end of line -> multiline option

| -> Or

#ATX-Section
^((?<layer>#{1,6}) #start of line and # - ######
\s* #optional whitespaces
(?<name>.+))$ #everything until end of line

当我激活多行选项时,regex101完美无缺。

然而,

RegexStorm(以及[regex]::matches()方法)似乎有所不同。

这是我的示例代码的更新:

$string = @'

Setex-Header1 layer 1
========================================================

Setex-Header2 layer 2
------------

Setex-Header3 layer 2
------------

### Atx-Header1 layer 3

#### Atx-Header2 layer 4

#### Atx-Header3 layer 4

#### Atx-Header4 layer 4


'@


$regex = '(?<name>[^\n\r]+)\n(?<Layer>[-|=]{2,})$|^((?<layer>#{1,6})\s*(?<name>.+))$'

$options = [text.regularexpressions.regexoptions]::Multiline

[regex]::Matches($string, $regex, $options).value

更新2 现在我的regex适用于regexstorm,但在使用选项multiline时仍然与powershell不匹配。

这里是字符串:((?<name>[^\n\r]+)\r\n(?<Layer>[-|=]{2,}))|((?<layer>#{1,6})\s*(?<name>.+))

任何想法该怎么做?

更新3

我刚刚发现,匹配就像魅力一样,但只有当我使用here-string作为匹配的输入时。如果我在示例文件上使用get content,则结果不匹配。我试图弄清楚,这里有什么不对 - 有人在这方面表现出来吗?

更新4:解决方案

我可以通过使用Get-Content-join "``n"(这里只有一个反向引号)解决这里的字符串或获取内容问题,从而找到可行的解决方案。

现在可以在github

获得工作职能