正则是什么
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,确认能匹配到预期片段再放进脚本批量处理,比在脚本里反复调试快得多。