Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Powershell正则表达式匹配[0]。组与匹配项。组基于关键字名称的索引_Regex_Powershell - Fatal编程技术网

Regex Powershell正则表达式匹配[0]。组与匹配项。组基于关键字名称的索引

Regex Powershell正则表达式匹配[0]。组与匹配项。组基于关键字名称的索引,regex,powershell,Regex,Powershell,我刚刚在PowerShell中遇到了这种奇怪的行为,我想知道是否有合理的解释: 在字符串上运行正则表达式匹配后: 是的,我知道,这可能不是最好的方法,但问题发生在构建管道时,在这里我只提供了一个简单的示例,它仍然展示了这种行为 $r=asdf |选择字符串?\w+ 以下两个表达式为我打印相同的结果: $r.Matches.Groups $r.Matches[0]。组 但在这两种方法中,只有第二种有效: $r.Matches.Groups['test'] $r.Matches[0]。组['test

我刚刚在PowerShell中遇到了这种奇怪的行为,我想知道是否有合理的解释:

在字符串上运行正则表达式匹配后: 是的,我知道,这可能不是最好的方法,但问题发生在构建管道时,在这里我只提供了一个简单的示例,它仍然展示了这种行为

$r=asdf |选择字符串?\w+ 以下两个表达式为我打印相同的结果:

$r.Matches.Groups $r.Matches[0]。组 但在这两种方法中,只有第二种有效:

$r.Matches.Groups['test'] $r.Matches[0]。组['test'] 最奇怪的是,如果我使用数字索引,它在两种情况下都有效

$r.Matches.Groups[0] $r.Matches[0]。组[0]
编辑:我知道在这个例子中,捕获组根本不是必需的,但我只想展示一个简单的例子来说明一个问题。最初,我使用的是多个模式和多个捕获组,我希望通过名称访问这些组。我知道我可以通过使用匹配项[0]来解决这个问题,但我对一个解释感兴趣。

这是因为PowerShell有一个名为属性枚举的功能

自PowerShell 4.0以来,每当您引用集合类型中不存在的成员时,PowerShell将枚举集合并调用每个项上的成员

这意味着这个表达式:

$g = $r.Matches.Groups
。。。基本上与:

$g = foreach($match in $r.Matches){
    foreach($group in $match.Groups){
        $group
    }
}
所以,在这一点上,$g不再是一个GroupCollection,它只是$r.Matches中任何匹配项的任何组中的值的数组


这也解释了[0]索引表达式工作的原因-正则数组可以被索引成很好的值。

要获取值,只需要$r.Matches[0].value。您不需要访问组[0]。你的管道是什么样子的?最初的问题是什么?最初我使用的是多个模式和多个捕获组,我想通过名称访问这些模式。非常感谢您理解这个问题并给出正确的答案!:我有点困惑,起初我只得到一个完全没有任何解释的评论,两张反对票和一张接近票,但现在这个答案已经得到,两张赞成票已经平衡了负面影响,我觉得这是一个总体上不错的问题,确实可以理解。@115别担心,这根本不是一个坏问题-当您使用PowerShell>4的时间足够长时,这是一个直观上有意义的问题,但如果您不知道,可能会让人非常困惑!