首页/系统/Windows 运维速查/正则 -match / -replace
PowerShell 基础66 条

正则 -match / -replace

内置正则支持:-match 判断与 $Matches 捕获、-replace 替换、[regex]::Matches 批量提取,比手工切分稳。

Windows 运维速查系统更新于 2026-10-13

正则是什么

PowerShell 内置正则支持:-match 做匹配判断并把结果放进自动变量 $Matches,-replace 做替换,[regex]::Matches 可以一次提取全部匹配。相比按固定位置切分字符串,正则能表达“长度可变的模式”,处理日志与文本更稳。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7
匹配'文本' -match '模式',结果取 $Matches[0] 为整体、$Matches[1..n] 为分组
替换'文本' -replace '模式','替换',替换串里可用 $1 引用分组
命名分组(?<名称>...) 匹配后用 $Matches['名称'] 取值
区分大小写-cmatch 与 -creplace 为区分大小写版本
批量提取[regex]::Matches(文本, 模式) 返回全部匹配

典型使用场景

  • 从日志行中提取 IP、时间戳、状态码等结构化字段
  • 校验输入格式,例如邮箱、路径、端口是否合法
  • 批量替换日志里的敏感信息后再对外分享
  • 从配置文件文本中抽取键值对
  • 搜索代码或文本中的模式,比通配符表达更精确

常用示例

常用示例
# 匹配并取整体捕获
'ip=10.0.0.8' -match '(\d+\.){3}\d+'
$Matches[0]
# 命名分组更易读
'2026-10-13 08:30 ERROR' -match '(?<date>\d{4}-\d{2}-\d{2})'
$Matches['date']
# 替换:把时间字段统一成占位符
(Get-Content app.log) -replace '\d{2}:\d{2}:\d{2}', 'TIME'
# 引用分组做重排
'10.0.0.8' -replace '(\d+)\.(\d+)\.(\d+)\.(\d+)', '$3.$4.$1.$2'
# 一次提取全部匹配
[regex]::Matches('a=1 b=22 c=333', '\d+').Value

常用语法速查

写法含义示例
\d任意数字字符\d{2} 匹配两位数字
.任意单个字符,默认不含换行a.c 匹配 abc
* 与 +重复零次以上与一次以上\d+ 匹配一段连续数字
(?<名称>...)命名捕获组(?<port>\d{4})
(?i)在模式内开启忽略大小写(?i)error 匹配 ERROR
$Matches 只在最近一次 -match 成功后有值,之后的任何一次匹配都会覆盖它。需要保留结果就立刻把它赋值给变量,不要等到后面再取。
-match 与 -replace 的模式是正则而不是通配符,路径里的点号和反斜杠必须转义,否则匹配范围会超出预期。用 -replace 修改文件内容前先备份,或先用 -WhatIf 思路试跑一遍。
写复杂的模式时先在少量样本上验证:把待处理的一两行文本直接粘进控制台跑 -match,确认能匹配到预期片段再放进脚本批量处理,比在脚本里反复调试快得多。

易错点

  • $Matches 会被下一次匹配覆盖,没有及时取值就会拿到别的结果
  • -replace 的模式是正则,路径里的点号与反斜杠不转义会匹配到意外内容
  • 不加前缀时匹配不区分大小写,安全校验场景应显式使用区分大小写的版本
  • 默认贪婪匹配会让 .* 吞掉整行,需要用 .*? 限定匹配范围
  • 对整段文本处理与逐行处理结果不同,写模式前要先明确处理对象是行还是全文

数据来源与参考

  • Microsoft Learn:about_Regular_Expressions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌