我正在做运动,但我不明白为什么它不起作用。
如果字符串仅包含“!”,它仍会触发第一个if语句。
Function Get-BobResponse() {
[CmdletBinding()]
Param(
[string]$HeyBob
)
if(($HeyBob -match "!") -and ($HeyBob -like "*?*")){
return "Calm down, I know what I'm doing!"
}
if($HeyBob -match "!"){
return "Whoa, chill out!"
}
if($HeyBob -Like "*?*"){
return "Sure"
}
if($HeyBob -eq ""){
return "Fine. Be that way!"
}
else{
return "Whatever"
}
}
答案 0 :(得分:4)
此通配符模式:
*?*
将匹配任何字符串和至少一个字符-因为?
是一个元字符,表示“完全是任何字符中的一个”。
您可以使用WildcardPattern.Escape()
来转义元字符或组:
$questionMark = [WildcardPattern]::Escape('?')
$HeyBob -like "*$questionMark*"
在单引号(即文字)字符串中,您可以使用反引号(`
)手动对其进行转义:
$HeyBob -like '*`?*'
请注意,您必须在双引号中将双引号转义(因为PowerShell对可扩展字符串和通配符模式都使用了反引号)
$HeyBob - like "*``?*"
在这两种情况下,您也都可以使用正则表达式,尽管在这种情况下,您仍然需要转义?
(因为它是正则表达式中的特殊量词):
$HeyBob -match '!' -and $HeyBob -match [regex]::Escape('?')
答案 1 :(得分:2)
表达式:
$HeyBob -match "!"
进行正则表达式匹配,并且$HeyBob
为!
时将表示为true
。
下一步:
$HeyBob -like "*?*"
是一个通配符,表示匹配零个或多个字符(第一个*),然后是一个字符(与!匹配),然后是零个或多个字符(第二个*)。与!
的比赛。
当两者都匹配时,您最终得到$true -and $true
,这是正确的,并导致执行第一个if
语句。