Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Powershell正则表达式用于在两个相同字符之间替换特定字符_Regex_Powershell - Fatal编程技术网

Regex 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

我正在尝试使用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) |
    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或更高版本以获得该功能。这非常有效,感谢您的帮助