PowerShell字符串匹配的奇怪行为

时间:2018-01-03 18:17:25

标签: string powershell match

当我在PowerShell中写这个时,

$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9"

它返回true。

但是当我在PowerShell中写这个时,

$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9bhau"

它返回false。

这种奇怪行为的原因是什么?它首先如何回归真实?

2 个答案:

答案 0 :(得分:0)

这种行为并不奇怪。 -match operatorregular expression匹配。在正则表达式中,?是一个特殊字符,其含义为#34;前面的表达式为#34;的零或更多倍。因此,(常规)表达式19?9表示"一个后跟零个或多个9和另外九个" (匹配19199199919999等。要恰好匹配一个任意字符,您需要使用.。但是,在您的情况下,您可能希望匹配一个数字(\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