gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:02:23 25 4
gpt4 key购买 nike

如果我有字符串:

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

最佳答案

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

我们知道,当&分隔两个路径时​​,下一个路径将以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

关于regex - 如何在可以包含该分隔符的一系列路径中替换该分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com