PowerShell正则提取:获取每行首个=后内容及无=整行
Windows PowerShell正则表达式提取解决方案
需求说明
- 对包含
=的行,提取首个=之后的所有内容(即便后续还有=也完整保留) - 对不包含
=的行,直接提取整行内容
示例输入
ErrorMoving=You cannot=another. ErrorTooMuchActions =Too many changes=.{k}=12=aa WorldErrorWait=An error has occurred.
期望输出
You cannot=another. ErrorTooMuchActions Too many changes=.{k}=12=aa An error has occurred.
问题分析
你之前使用的正则(?<=\+?=).*存在两个问题:
- 多余的
\+?匹配逻辑,这里不需要匹配+符号,属于无效规则 - 该正则仅能匹配包含
=的行,不含=的行无法匹配到内容,最终输出空行
正确实现方案
正则表达式
使用以下正则可同时适配两种场景:
^[^=]*(?:=(.*))?$
规则解释
^[^=]*:匹配行首到第一个=之前的所有内容(无=时则匹配整行)(?:=(.*))?:非捕获组,匹配首个=及其后续全部内容,?标记该组为可选(对应无=的行)- 最终提取分组1的内容;若分组1为空(即无
=的行),则直接使用原行内容
PowerShell命令示例
若处理本地文本文件input.txt并输出到output.txt,可使用以下命令:
Get-Content input.txt | ForEach-Object { if ($_ -match '^[^=]*(?:=(.*))?$') { $matches[1] ?? $_ } } | Set-Content output.txt
或者更简洁的替换写法:
(Get-Content input.txt) -replace '^[^=]*=(.*)$|^([^=]+)$', '$1$2' | Set-Content output.txt
该替换逻辑:
- 匹配含
=的行:^[^=]*=(.*)$,替换为分组1的内容 - 匹配不含
=的行:^([^=]+)$,替换为分组2的内容 - 自动合并两种场景的输出结果
内容的提问来源于stack exchange,提问作者Kenryoku
相关产品推荐
相关产品推荐

