Regex Powershell正则表达式用于在两个相同字符之间替换特定字符
我正在尝试使用Powershell替换分号Regex Powershell正则表达式用于在两个相同字符之间替换特定字符,regex,powershell,Regex,Powershell,我正在尝试使用Powershell替换分号的管道|位于以分号分隔的文件中,因此它是一组特定的分号,出现在双引号“之间。以下是一个文件示例,其中特定部分以粗体显示: 军营;巴西;AI;BCS GRU;MIL-32011257;172-43333640;;“1975995;1972871;1975“;FAC0088/21;3;20.000;24.8;25.000;.149;玻璃配件;EXW;C;.00;欧元 我已尝试使用-replace,如下所示: (Get-Content $file.PSPath
代码>的管道|
位于以分号分隔的文件中,因此它是一组特定的分号,出现在双引号“
之间。以下是一个文件示例,其中特定部分以粗体显示:
军营;巴西;AI;BCS GRU;MIL-32011257;172-43333640;;“1975995;1972871;1975“;FAC0088/21;3;20.000;24.8;25.000;.149;玻璃配件;EXW;C;.00;欧元
我已尝试使用-replace
,如下所示:
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace '".*(;).*"',"|" } |
但是,正则表达式不会用管道替换引号之间的分号。我尝试了其他几个正则表达式,但都没有用。我该怎么做才能做到这一点?您可以使用带有回调的方法作为替换参数:
$s = 'Camp;Brazil;AI;BCS GRU;;MIL-32011257;172-43333640;;"1975995;1972871;1975";FAC0088/21;3;20.000;24.8;25.000;.149;GLASSES SPARE PARTS,;EXW;C;.00;EUR;'
$rx = [regex]'"[^"]*"'
$rx.Replace($s, { param($m) $m.value.Replace(';','|') })
# => Camp;Brazil;AI;BCS GRU;;MIL-32011257;172-43333640;;"1975995|1972871|1975";FAC0088/21;3;20.000;24.8;25.000;.149;GLASSES SPARE PARTS,;EXW;C;.00;EUR;
也就是说,匹配两个“
字符之间的任何子字符串,并替换所有代码>字符,仅在匹配项中包含|
另外,这里是PowerShell Core v6.1+版本,您可以将脚本块作为-replace
替换操作数传递,其中匹配表示为自动$\ucode>变量:
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace '"[^"]*"', { $_.Value.Replace(';', '|') } }
为什么不使用lookarounds?
由于左侧和右侧分隔符是相同的单字符,“
,因此任何基于查找的解决方案都可能出错或太长,并且仍然容易出错。这是因为查找不使用它们匹配的文本,因此每个”
都可以作为初始单独匹配“
。查看(?非常有趣。以前从未见过此技术。Wiktor,感谢您的帮助。我正在升级到PowerShell 6.1或更高版本以获得该功能。这非常有效,感谢您的帮助