如果我有字符串:
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
答案 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]