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

如何在PowerShell中从文本文件提取匹配正则表达式的字符串?

解决PowerShell中提取Select-String匹配字符串的问题

我懂你的需求啦——你已经用正则匹配到了目标字符串,但不知道怎么把这些匹配结果单独提取出来,而不是返回一堆包含行信息的MatchInfo对象。咱们来一步步搞定:

首先,你原来的命令Get-ChildItem $path\a.txt | Select-String "M(\d{10})"返回的是MatchInfo对象集合,里面包含了匹配的行、位置等额外信息,不是直接的匹配字符串。要拿到纯匹配内容,得访问对象的Matches属性,同时别忘了加-AllMatches参数(因为你的目标文本里一行有多个匹配项,不加的话只会捕获第一个)。

方法一:一键获取拼接后的结果

用这条命令就能直接得到你想要的空格分隔输出:

(Get-ChildItem $path\a.txt | Select-String -Pattern "M\d{10}" -AllMatches).Matches.Value -join " "

拆解一下逻辑:

  1. -AllMatches:强制捕获一行内的所有匹配项(比如你例子里的两个M开头编号)
  2. .Matches.Value:从MatchInfo对象里提取每个匹配的纯字符串内容
  3. -join " ":把所有提取到的字符串用空格连接成一行

方法二:分步处理(更直观)

如果想更清晰地看到每一步的结果,可以拆成几步操作:

# 先获取所有匹配的结果对象
$matchResults = Get-ChildItem $path\a.txt | Select-String -Pattern "M\d{10}" -AllMatches
# 从结果对象里提取每个匹配的字符串
$targetStrings = $matchResults.Matches | ForEach-Object { $_.Value }
# 把字符串拼接成空格分隔的格式
$targetStrings -join " "

两种方法最终都会输出你期望的结果:

M2686678688 M1236687688

额外补充:你的正则M(\d{10})里的括号是捕获组,如果之后需要单独提取数字部分,可以用$_.Groups[1].Value,但你要的是包含M的完整字符串,所以直接用$_.Value就足够啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:06