【问题标题】:Multiline regex match in PowerShell with or without lookaheadPowerShell中的多行正则表达式匹配,带或不带前瞻
【发布时间】:2020-09-05 18:19:29
【问题描述】:

我正在尝试格式化 Markdown 文件,以便在标题后有一个空行,该文件是 UTF8 编码与 CRLF 换行符,这里是示例文件:

## 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>

其他正则表达式尝试如下,但均无效:

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

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

^#+\s.*$(?=\n^.+) 在 VSCode 引擎上工作得很好,\n 用于 VSCode 但在 PowerShell 中应该使用 (?m)\r\n\n 但这些构造都不起作用。

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

编辑:

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

$FileData = Get-Content file.md -Raw

foreach ($Line in $FileData) {
if ($Line -match '^#+\s.*$(?=\s^.+)') { $Matches }  
}

我尝试了此处发布的所有示例正则表达式,但输出错误或全部没有输出

【问题讨论】:

  • 你需要将整个文件读入一个变量,$FileData = Get-Content file.md -Raw
  • 谢谢,我编辑了我的问题,仍然有问题。
  • 我明白了,if ($FileData -match '(?m)^#+\s.*$\s*^.+') { $Matches } 返回第一个匹配项,需要弄清楚如何获取所有匹配项.. 感谢您的评论!
  • 您仍然做错了:您需要将整个文本作为一个字符串发送到正则表达式。

标签: regex powershell visual-studio-code multiline


【解决方案1】:

您需要确保将整个文件作为单个变量发送到正则表达式使用 -Raw 选项。

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

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

请参阅regex demo

  • (?m) - 现在,^ 匹配行首,$ 匹配行尾
  • ^ - 行首
  • #+ - 一个或多个 # 字符
  • [\p{Zs}\t] - 任何水平空格
  • .* - 除换行符/换行符以外的任何零个或多个字符
  • $ - 行尾(换行符之前的位置)
  • (?=\n.) - 肯定的前瞻,确保在当前位置的右侧有一个换行符和除换行符之外的任何字符。

在 Powershell 中,您可以使用

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

【讨论】:

  • 嗨,朋友,非常感谢你,我已经用你的代码做了实验,当我访问波兰时,这就是我们喝啤酒的代码! $FileData | Select-String '(?m)^#+\s.+$(?=\n[\w|``]+)' -AllMatches | Foreach-Object { $_.Matches.Value }
猜你喜欢
  • 2021-11-09
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多