当我在PowerShell中写这个时,
$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9"
它返回true。
但是当我在PowerShell中写这个时,
$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9bhau"
它返回false。
这种奇怪行为的原因是什么?它首先如何回归真实?
答案 0 :(得分:0)
这种行为并不奇怪。 -match
operator与regular expression匹配。在正则表达式中,?
是一个特殊字符,其含义为#34;前面的表达式为#34;的零或更多倍。因此,(常规)表达式19?9
表示"一个后跟零个或多个9和另外九个" (匹配19
,199
,1999
,19999
等。要恰好匹配一个任意字符,您需要使用.
。但是,在您的情况下,您可能希望匹配一个数字(\d
或[0-9]
)而不是任何字符。
如果你想使用通配符匹配(?
表示"任何单个字符"和*
表示"零个或多个字符")你需要使用-like
运算符。但要注意,虽然-match
运算符匹配字符串中任何位置的模式(除非模式已锚定),但-like
运算符会隐式地将表达式锚定在字符串的开头和结尾处,除非您放置{ {1}}在模式的开头和/或结尾。例如*
匹配" 1979"和" 19m9",但不是" a1979"或" 1979a"。你需要-like '19?9'
。
答案 1 :(得分:0)
或者这些选项......
$Person ="Guy Thomas 1949bhau"
$Pattern = '19?.*9'
(((Select-String -InputObject $Person -Pattern $Pattern -AllMatches).Matches).Value)
Results
1949
$Person ="Guy Thomas 1949bhau"
$Pattern = '19?.*9*'
(((Select-String -InputObject $Person -Pattern $Pattern -AllMatches).Matches).Value)
Resutls
1949bhau
或者
[regex]::Matches($Person,$Pattern)
Results
Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 11
Length : 8
Value : 1949bhau
或者
[regex]::Matches($Person,$Pattern).Value
Results
1949bhau