PowerShell中的多行regex匹配(带或不带前瞻性)



我正在尝试格式化markdown文件,以便在标题后面有一行空行,该文件是用CRLF换行符编码的UTF8,下面是示例文件:

## DESCRIPTION
description entry...
## EXAMPLES
### EXAMPLE 1
```
some example here...
```
## OUTPUTS
## NOTES

在这里,我想找到所有没有空行的标题,假设文件名为file.md,这里是示例代码,其唯一目的是匹配缺少空行的标题:

$FileData = Get-Content file.md
if ($FileData -match '(?m)^#+s.*$s*^.+') { $Matches }

预期输出:

## DESCRIPTION
### EXAMPLE 1
## OUTPUTS

实际输出:

<no output>

其他regex尝试如下,但都不起作用:

(?m)^#+s.*n*^.+
(?m)^#+s.*rn*^.+
^#+s.*$(?=n^.+)
^#+s.*$(?=rn^.+)
^#+s.*$(?=s^.+)

什么都不匹配,这些正则表达式应该可以工作,因为只需对VSCode进行少量修改,它们就可以正常工作,但在PowerShell中却不行,例如:

^#+s.*$(?=n^.+)适用于VSCode引擎,n用于VSCode,但在PowerShell中应使用(?m)rnn,但这些构造都不起作用。

我相信有人对此有答案,但请在你的答案中说明为什么(?m)rn都不起作用,以及如何在这种特定情况下使用它们?

编辑:

根据Wiktor的评论,我尝试了他的建议,但没有给我想要的结果:

$FileData = Get-Content file.md -Raw
foreach ($Line in $FileData) {
if ($Line -match '^#+s.*$(?=s^.+)') { $Matches }  
}

我尝试了这里发布的所有示例正则表达式,但输出是错误的,或者所有正则表达式都没有输出

您需要确保将整个文件作为单个变量发送到regex usingn-Raw选项。

然后,你需要确保模式在多行模式下工作,你可以使用

(?m)^#+[p{Zs}t].*$(?=n.)

请参阅regex演示。

  • (?m)-现在,^匹配行的开始,$匹配行的结束
  • ^—线路起点
  • #+-一个或多个#字符
  • [p{Zs}t]-任何水平空白
  • .*-换行符以外的任何零个或多个字符
  • $-行尾(换行符之前的位置(
  • (?=n.)-一个积极的前瞻性,确保在当前位置的右侧有一条换行符和除换行符之外的任何字符

在Powershell中,您可以使用

Get-Content 'c:11.txt' -Raw | Select-String '(?m)^#+[p{Zs}t].*$(?=n.)' -AllMatches | Foreach {$_.Matches} | Foreach-Object {$_.Value}

最新更新