PowerShell正则提取Captain与Members间多行内容转数组遇问题求解
解决PowerShell中提取Captain和Members之间行的问题
问题原因
你当前的正则表达式在PowerShell中失效的主要原因有两个:
- Select-String默认逐行处理:
Select-String默认会将输入文本按行拆分后逐一匹配,你的多行正则表达式无法跨多行找到匹配项。必须使用-Raw参数让它读取整个文本作为单个字符串。 - 正则细节问题:原表达式中的
(?=\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
相关产品推荐
相关产品推荐

