PowerShell正则表达式匹配求助:含括号字符串识别异常
修正PowerShell正则匹配问题
你的正则代码在处理最后一个条目009012 APP-1(21).1时出现错误,核心问题有两个:
- 全局匹配会提取所有符合的数字片段(包括括号内的
21和末尾的1),导致额外输出CCI-1; - 第二组正则限制仅匹配2个字母开头,无法覆盖
APP这类多字母前缀的情况,且未完整匹配括号和后续的.1部分。
方案1:按字符串结构拆分(推荐,简单直接)
直接针对每个条目的固定结构(开头数字 + 空格 + 后续内容)进行分组匹配,无需复杂格式验证:
$CCI_ID = @( "003417 AR-2.1" "003425 AR-2.9" "003392 AP-1.12" "009012 APP-1(21).1" ) $CCI_ID | ForEach-Object { if ($_ -match '^(\d+)\s+(.+)$') { Write-Host "CCI-$($matches[1].Trim())" Write-Host $matches[2].Trim() } }
方案2:修正原正则(需保留格式验证时使用)
如果必须验证后续内容的格式,调整正则以支持多字母前缀,并确保完整匹配后续部分,同时针对每个条目单独匹配而非全局提取:
$CCI_ID = @( "003417 AR-2.1" "003425 AR-2.9" "003392 AP-1.12" "009012 APP-1(21).1" ) $CCI_ID | ForEach-Object { $matches = [regex]::Match($_, '^(\d+)\s+([a-zA-Z]+-\d(?:\(\d+\))?\.\d+)$') if ($matches.Success) { Write-Host "CCI-$($matches.Groups[1].Value.Trim())" Write-Host $matches.Groups[2].Value.Trim() } }
修正后的正则说明:
[a-zA-Z]+匹配任意长度的字母前缀(支持2个或多个);(?:\(\d+\))?匹配可选的带数字的括号(非捕获组,避免额外分组);- 整体确保每个条目只匹配一次,提取完整的两部分内容。
内容的提问来源于stack exchange,提问作者Matt Williamson
相关产品推荐
相关产品推荐

