我有以下PowerShell代码。
$input = 'ADM:Dev_ControllerStore_103:1:2'
$pattern = '^(?<UID>\S+)\:(?<DB>\S+)\:(?<AppId>\d+)(?:\:(?<LicNr>\d+))?$'
if ( $input -match $pattern ) {
$Matches
}
这给出了以下输出。
Name Value
---- -----
DB 1
AppId 2
UID ADM:Dev_ControllerStore_103
0 ADM:Dev_ControllerStore_103:1:2
虽然我希望这样:
Name Value
---- -----
DB 1
AppId 2
UID ADM:Dev_ControllerStore_103
LicNr 2
0 ADM:Dev_ControllerStore_103:1:2
即: LicNr
要包含在输出中。
注意:我得到的输出是输入字符串的预期输出。'ADM:Dev_ControllerStore_103:1'
...而且工作正常。
如果我修改了regex,使最后一个非捕获组是非可选的,或者我删除了非捕获组,那么对于较长的输入字符串来说,所有的工作都是正确的;但是很明显,这些并不能满足只有3个值而不是4个值的版本。
是我理解错了什么,还是PowerShell的一个bug?
注意: 我有一个变通的方法 (~) $a,$b,$c,$d = $input -split ':'
),所以这个问题只是为了学术兴趣。
的 \S
模式匹配任何非空格字符,包括 :
和数字。你可以通过使用懒惰的 \S+?
模式。'^(?<UID>\S+?):(?<DB>\S+?):(?<AppId>\d+)(?::(?<LicNr>\d+))?$'
但也可能使用更精确的模式,将使用更适合你的输入的模式。
^(?<UID>\w+):(?<DB>\w+):(?<AppId>\d+)(?::(?<LicNr>\d+))?$
参见 搜索引擎演示
详细内容
^
- 弦首(?<UID>\w+)
- 组UID:一个或多个单词字符:
- 冒号(?<DB>\w+)
- 组数据库:一个或多个单词字符:
- 冒号(?<AppId>\d+)
- 集团AppId:一个或多个数字(?::(?<LicNr>\d+))?
- 一个可选的组:a :
然后是Group LicNr: 1+位数$
- 字符串的末端。由于你想在 :
并在最后有一个可选的部分,让你的量化器在该选项之前是非贪婪的。
$input = 'ADM:Dev_ControllerStore_103:1:2'
$pattern = '^(?<UID>\S+?)\:(?<DB>\S+?)\:(?<AppId>\d+?)(?:\:(?<LicNr>\d+))?$'
if ( $input -match $pattern ) {
$Matches
}
输出:
Name Value
---- -----
DB Dev_ControllerStore_103
AppId 1
UID ADM
LicNr 2
0 ADM:Dev_ControllerStore_103:1:2