使用PowerShell正则表达式提取指定分隔符间的首个匹配内容
PowerShell正则提取目标内容解决方案
正则表达式方案
针对需求,可使用以下正则匹配两种格式的目标内容,同时处理带引号字段内的逗号、转义字符及换行符:
(?<=^|,)(?:"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+))(?=,|$)
正则说明
(?<=^|,):匹配行首或逗号之后的起始位置,确保从目标字段开头开始匹配"([^"\\]*(?:\\.[^"\\]*)*)":匹配被双引号包裹的字段,支持处理转义字符(如\"),捕获引号内的内容到分组1|([^,]+):匹配无引号的逗号分隔字段,捕获内容到分组2(?=,|$):匹配逗号或行尾的结束位置,确保截取到目标字段结尾
PowerShell 实现代码
# 测试输入行 $inputLines = @( '"0x00000000","What do you want to eat? fish, meat or\n eggs?",""', '"0x00030002","What do you want to eat?",""', '0x00030002,What do you want to eat?,' ) foreach ($line in $inputLines) { if ($line -match '(?<=^|,)(?:"([^"\\]*(?:\\.[^"\\]*)*)"|([^,]+))(?=,|$)') { # 优先取带引号的分组结果,无则取无引号分组 $targetContent = $matches[1] ?? $matches[2] # 将\n替换为空格并去除首尾空白 $formattedContent = $targetContent -replace '\\n', ' ' | Trim Write-Output $formattedContent } }
原正则问题分析
你之前的正则存在两处关键问题:
- 语法错误:
\?<=是错误写法,正向预查的正确格式是(?<=) - 匹配逻辑缺陷:
.*会贪婪匹配到最后一个逗号/引号,无法正确处理带引号内的逗号,导致匹配结果不符合预期
内容的提问来源于stack exchange,提问作者Kenryoku
相关产品推荐
相关产品推荐

