如何在可以包含该分隔符的一系列路径中替换该分隔符?

时间:2019-01-10 03:38:50

标签: regex string powershell replace delimiter

如果我有字符串:

path1=/path/me & you/file.json&path2=/path/you & me/file.txt

我希望输出如下:

path1=/path/me & you/file.json;path2=/path/you & me/file.txt

我尝试过这样:

"path1=/path/me & you/file.json&path2=/path/you & me/file.txt" -replace "&",";"

但是会产生

path1=/path/me ; you/file.json;path2=/path/you ; me/file.txt

2 个答案:

答案 0 :(得分:1)

当然,问题在于,有时& 划定了路径,有时又是了 路径的一部分。一个简单的字符替换将无法分辨哪个&是哪个,因此我们需要使用一些上下文来弄清楚。

我们知道,当&分隔两个路径时​​,下一个路径将以pathX=形式的标签开始。我们可以使用模式&(?=(path\d+=))来匹配这样的&个字符。 (?=)zero-width positive lookahead assertion,这意味着其中的所有内容都必须遵循&,但实际上不会被匹配(替换)。 path\d+=表示文字字符path,后跟one or more digits\d+),后跟文字字符=

PS> $pattern = '&(?=(path\d+=))'
PS> 'path1=/path/me & you/file.json' -replace $pattern, ';'
path1=/path/me & you/file.json
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt&path3=/folder/R & B/ me & you/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt;path3=/folder/R & B/ me & you/file.txt
PS> '&path1=/path/me & you/file.json&path2=/path/you & me/file.txt' -replace $pattern, ';'
;path1=/path/me & you/file.json;path2=/path/you & me/file.txt
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt&' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt&
PS> 'path1=/path/me & you/file.json&&path2=/path/you & me/file.txt&&&&&path3=/folder/R & B/ me & you/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json&;path2=/path/you & me/file.txt&&&&;path3=/folder/R & B/ me & you/file.txt

请注意,按预期替换了前导&(第四个测试输入),因为它后面是通常的path1=,但后面是&(第五个测试输入)并且连续多个&(最后的测试输入)不是。如果这些情况应被视为空路径,而不是以&结尾的文件名,则可以使用模式&+(?=(path\d+=)|$)来实现。 &+现在将与one or more &匹配,并且添加|$also match &出现在end of the string

PS> $pattern = '&+(?=(path\d+=)|$)'
PS> 'path1=/path/me & you/file.json' -replace $pattern, ';'
path1=/path/me & you/file.json
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt&path3=/folder/R & B/ me & you/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt;path3=/folder/R & B/ me & you/file.txt
PS> '&path1=/path/me & you/file.json&path2=/path/you & me/file.txt' -replace $pattern, ';'
;path1=/path/me & you/file.json;path2=/path/you & me/file.txt
PS> 'path1=/path/me & you/file.json&path2=/path/you & me/file.txt&' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt;
PS> 'path1=/path/me & you/file.json&&path2=/path/you & me/file.txt&&&&&path3=/folder/R & B/ me & you/file.txt' -replace $pattern, ';'
path1=/path/me & you/file.json;path2=/path/you & me/file.txt;path3=/folder/R & B/ me & you/file.txt

答案 1 :(得分:0)

您不一定总是需要花哨的一行代码来一次性完成所有操作。

$test = $('path1=/path/me & you/file.json&path2=/path/you & me/file.txt' -split "&"); $test[0] + "&" + $test[1] + ";" + $test[2] + "&" + $test[3]