在可选的非捕获组中命名的捕获组。

问题描述 投票:0回答:1

我有以下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 ':'),所以这个问题只是为了学术兴趣。

regex powershell powershell-5.0
1个回答
2
投票

\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+位数
  • $ - 字符串的末端。

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 
© www.soinside.com 2019 - 2024. All rights reserved.