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

PowerShell正则提取多行内容失败求助:Select-String无返回结果

解决PowerShell中Select-String无法匹配多行正则的问题

我帮你排查了下问题,核心是两个关键原因,还有对应的修复方案:

1. 先修正代码里的低级语法错误

你写的Select-String -Pattern $ModifyOldRegex.matches.Value完全是错的!$ModifyOldRegex只是一个存储正则表达式的字符串变量,它根本没有matches属性——这会导致你传给-Pattern参数的是空值或者无效内容,自然返回不了任何匹配结果。

2. 调整正则适配PowerShell的.NET引擎

在线正则工具和PowerShell用的.NET正则引擎有几个差异,导致你在网页上能用的正则到了PowerShell里失效:

  • Windows系统下的换行是\r\n,但你正则里只写了\n,会匹配不到实际的换行
  • Select-String默认是逐行匹配,不会跨多行查找内容,需要启用多行模式

修正后的正则表达式

把正则改成这样,兼容换行符并启用多行模式:

$ModifyOldRegex = "(?m)(?<=----Old-------\r?\n)([\s\S]*?)(?=__________________________________________)"

正则说明:

  • (?m):启用多行模式,让正则引擎正确识别跨行的边界
  • \r?\n:同时匹配Windows的\r\n和类Unix的\n换行符
  • [\s\S]*?:非贪婪匹配任意字符(包括换行),直到遇到后面的长分隔线,比你原来的嵌套分组更高效可靠

3. 正确使用Select-String提取内容

用修正后的正则,搭配-AllMatches和确保输入是原始多行文本:

# 假设$Description是包含目标内容的字符串(如果从文件读,一定要加-Raw)
$Description = Get-Content "你的文件路径.txt" -Raw

# 执行匹配
$matchResult = $Description | Select-String -Pattern $ModifyOldRegex -AllMatches

# 提取匹配到的内容
$oldRoleContent = $matchResult.Matches.Value

# 输出结果
$oldRoleContent

备选方案:直接用.NET正则类

如果觉得Select-String不好用,也可以直接调用.NET的[regex]类,更灵活:

$oldRoleContent = [regex]::Match($Description, $ModifyOldRegex).Value

测试验证

你可以用这段测试代码快速验证:

$testContent = @"
----Old-------
250096 - LT Security Role: Read Only
250097 - LT Security Role: Admin
250098 - LT Security Role: Operator
__________________________________________
这里是分隔线后面的无关内容
"@

$ModifyOldRegex = "(?m)(?<=----Old-------\r?\n)([\s\S]*?)(?=__________________________________________)"
$matchResult = $testContent | Select-String -Pattern $ModifyOldRegex -AllMatches
$matchResult.Matches.Value

运行后会输出三个角色条目,证明正则和代码正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:16:17