我有以下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'
...的预期输出,并且可以正常工作。如果我更改了正则表达式以使最后一个非捕获组成为非可选,或者删除了非捕获组,则对于较长的输入字符串,所有这些都可以正常工作;但显然这些不适合仅3个值而不是4个值的版本。
我是否在我的理解范围内缺少某些东西,或者这是PowerShell中的错误?
注意:我有一个解决方法(〜
$a,$b,$c,$d = $input -split ':'
),因此此问题仅出于学术目的。 最佳答案
\S
模式与任何非空白字符匹配,包括:
和数字。您可以通过使用惰性\S+?
模式'^(?<UID>\S+?):(?<DB>\S+?):(?<AppId>\d+)(?::(?<LicNr>\d+))?$'
来修复该模式,但也可以使用更精确的模式,该模式将使用更适合您输入的模式:
^(?<UID>\w+):(?<DB>\w+):(?<AppId>\d+)(?::(?<LicNr>\d+))?$
见regex demo
详细信息
^
-字符串(?<UID>\w+)
-组UID:一个或多个单词char :
-冒号(?<DB>\w+)
-组DB:一个或多个单词char :
-冒号(?<AppId>\d+)
-组AppId:一个或多个数字(?::(?<LicNr>\d+))?
-可选组:一个:
,然后是组LicNr:1个以上数字$
-字符串结尾。 关于regex - 可选的非捕获组中的命名捕获组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61778537/