我尝试创建一个解析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
有关如何制作该正则表达式字符串的任何想法吗?
答案 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
获得工作职能