You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell正则提取Captain与Members间多行内容转数组遇问题求解

解决PowerShell中提取Captain和Members之间行的问题

问题原因

你当前的正则表达式在PowerShell中失效的主要原因有两个:

  1. Select-String默认逐行处理:Select-String 默认会将输入文本按行拆分后逐一匹配,你的多行正则表达式无法跨多行找到匹配项。必须使用 -Raw 参数让它读取整个文本作为单个字符串。
  2. 正则细节问题:原表达式中的 (?=\n\sMembers:) 包含多余的 \s(空格),而输入中 Members: 是单独一行,没有前置空格;另外 (.|\n)* 可以用更高效的 [\s\S]*?(非贪婪匹配任意字符,包括换行)替代。

解决方案

假设你的文本已经存储在变量 $text 中,以下两种方法都可以实现需求:

方法1:使用Select-String(带-Raw参数)

# 提取Captain:和Members:之间的内容,拆分为非空行数组
$capturedArray = ($text | Select-String -Pattern '(?<=Captain:\n)([\s\S]*?)(?=\nMembers:)' -Raw).Split("`n") | Where-Object { $_ -match '\S' }

方法2:直接使用.NET正则类

$match = [regex]::Match($text, '(?<=Captain:\n)([\s\S]*?)(?=\nMembers:)')
if ($match.Success) {
    $capturedArray = $match.Value.Split("`n") | Where-Object { $_ -match '\S' }
}

代码说明

  • (?<=Captain:\n):正向预查,匹配 Captain: 换行后的位置
  • ([\s\S]*?):非贪婪匹配任意字符(包括换行),直到遇到下一个匹配项
  • (?=\nMembers:):正向预查,匹配 Members: 换行前的位置
  • .Split("n")`:将匹配到的多行文本拆分为数组元素
  • Where-Object { $_ -match '\S' }:过滤掉空行(如果有的话)

内容的提问来源于stack exchange,提问作者Po_temkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:02:02