我是PowerShell新手。当我尝试使用通配符将字符串中的某个字符替换为一些新字符时遇到了问题。代码有什么问题?
$file = "want apple banana want want" $file.Replace("w*t","wanna")
PowerShell输出“想要苹果香蕉想要”,但为什么不是“想要苹果香蕉想要”呢?如果有人能帮助我,我将不胜感激。:)
j7dteeu81#
String.Replace不支持模式匹配,它只进行文字替换:
String.Replace
PS ~> "want apple banana want want".Replace("want", "wanna") wanna apple banana wanna wanna
我建议使用-replace正则表达式操作符:
-replace
PS ~> "want apple banana want want" -replace "w.*?t", "wanna" wanna apple banana wanna wanna
yk9xbfzb2#
PowerShell和. NET framework都没有内置功能来执行实际的 * wildcard * 替换。我建议使用 * RegEx * -replace操作符,如this answer所示。这为您提供了使用通配符的所有可能性,甚至提供了更灵活的搜索和替换方式。如果你真的想做一个 * wildcard * 替换,一个简单的实现可以将一个wildcard模式转换成一个 * regular expression * 模式,然后使用-replace操作符来做实际的替换:
Function WildcardReplace( $Text, $Wildcard, $Substitute ) { $regex = [regex]::Escape( $Wildcard ).Replace('\?', '.').Replace('\*', '.*?') $Substitute = $Substitute.Replace('$', '$$') $Text -replace $regex, $Substitute }
$file = "want apple banana want want" WildcardReplace $file "w*t" "wanna" WildcardReplace $file "w??t" "wanna"
wanna apple banana wanna wanna wanna apple banana wanna wanna
[regex]::Escape( $Wildcard )
\
.Replace('\?', '.')
?
.
.Replace('\*', '.*?')
*
.*
w*t
w.*t
want apple banana want want
$Substitute.Replace('$', '$$')
$
2条答案
按热度按时间j7dteeu81#
String.Replace
不支持模式匹配,它只进行文字替换:我建议使用
-replace
正则表达式操作符:yk9xbfzb2#
PowerShell和. NET framework都没有内置功能来执行实际的 * wildcard * 替换。我建议使用 * RegEx *
-replace
操作符,如this answer所示。这为您提供了使用通配符的所有可能性,甚至提供了更灵活的搜索和替换方式。如果你真的想做一个 * wildcard * 替换,一个简单的实现可以将一个wildcard模式转换成一个 * regular expression * 模式,然后使用
-replace
操作符来做实际的替换:[regex]::Escape( $Wildcard )
escapes通配符模式中在RegEx模式中具有特殊含义的任何字符,方法是在这些字符前面加上反斜杠(\
)。.Replace('\?', '.')
将?
通配符转换为等效的RegEx模式.
。.Replace('\*', '.*?')
将*
通配符模式转换为与 * non-greedy * 匹配的RegEx模式,这正是您在这里想要的。如果RegEx是.*
,它将匹配尽可能多的字符,在这种情况下,通配符w*t
(-〉RegExw.*t
)将匹配whole输入字符串want apple banana want want
。$Substitute.Replace('$', '$$')
通过将$
字符加倍来转义替换模式中的$
字符,因为$
字符在RegEx substitute中具有特殊含义。