我有以下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/

    10-10 20:15