【问题标题】:Powershell match multiline regex in filePowershell匹配文件中的多行正则表达式
【发布时间】:2021-12-07 06:01:42
【问题描述】:

我有这样的正则表达式:

^(?m)[ ]{0,}<img[ ]{0,}(?:\n(?:(?!<img).)*?){1,}[[]src[]]=[""|']{1}(.*?)[""|']{1}(?:\n(?:(?!<img).)*?){0,}[>]{1}$

我想得到一个文件中第一行匹配的内容:

<img
  *ngIf="amImg && amImg.sourcePath"
  [src]="amImg.sourcePath"
  [alt]="amImg.alt">

<p>asdasdasd asd</p>

<img
  [src]="amImg.sourcePath"
  [alt]="amImg.alt">

正则表达式完美运行,我已经对其进行了测试here...
在这种情况下匹配为 2:

<img
  *ngIf="amImg && amImg.sourcePath"
  [src]="amImg.sourcePath"
  [alt]="amImg.alt">

还有:

<img
  [src]="amImg.sourcePath"
  [alt]="amImg.alt">

所以第一个匹配的第一组结果应该是amImg.sourcePath,它有一些行号
第二场比赛第一组结果应该是amImg.sourcePath,其中有另一个行号

我试过了:

(select-string -path $path -pattern $pattern) | ForEach-Object{...}

等等……但它甚至找不到匹配项……

【问题讨论】:

  • 您需要传递-Raw 参数来读取包含所有换行符的文件到单个变量中,否则,正则表达式引擎无法找到跨行的跨度匹配。
  • @WiktorStribiżew 但是我怎样才能得到行号呢?
  • 正则表达式匹配是不知道的行号。需要单独获取匹配行号。
  • 我明白.. 但如何?

标签: regex powershell


【解决方案1】:

经过一番头脑风暴,结果如下:

$path = ........
$content = Get-Content -Path $path -Raw
$regex = [regex] '(?m)^[ ]{0,}<img[ ]{0,}(?:\r?\n(?:(?!<img).)*?){1,}[[]src[]]=["|'']{1}(.*?)["|'']{1}(?:\r?\n(?:(?!(<)).)*?){0,}[>]{1}'
foreach ($m in $regex.Matches($content)) {
  $lineNumber = ($content.Substring(0, $m.Index + 1) | Measure-Object -Line).Lines
  "Found '$($m.Groups[1].Value)' at line $lineNumber" 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 2011-08-18
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多