首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell regex Matches[0].Groups与基于Matches.Groups键名的索引

Powershell regex Matches[0].Groups与基于Matches.Groups键名的索引
EN

Stack Overflow用户
提问于 2020-05-23 12:36:11
回答 1查看 631关注 0票数 4

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

在字符串上运行regex匹配之后:

(是的,我知道,这可能不是最好的方法,但问题发生在构建管道时,这里我只给出了一个被剥离的最小示例,它仍然显示了这种行为。)

代码语言:javascript
复制
    $r = "asdf" | Select-String "(?<test>\w+)"

以下两个表达式为我打印相同的结果:

代码语言:javascript
复制
    $r.Matches.Groups
    $r.Matches[0].Groups

但在这两种方法中,只有第二种有效:

代码语言:javascript
复制
    $r.Matches.Groups['test'] 
    $r.Matches[0].Groups['test']

最奇怪的是,如果我使用数字索引,它在这两种情况下都能工作。

代码语言:javascript
复制
    $r.Matches.Groups[0] 
    $r.Matches[0].Groups[0] 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-23 12:58:45

这是因为PowerShell特性称为属性枚举。

从PowerShell 4.0开始,每当引用集合类型上不存在的成员时,PowerShell将枚举集合并在每个项上调用成员。

这意味着这个短语:

代码语言:javascript
复制
$g = $r.Matches.Groups

..。基本上是相同的:

代码语言:javascript
复制
$g = foreach($match in $r.Matches){
    foreach($group in $match.Groups){
        $group
    }
}

因此,此时,$g不再是GroupCollection- -它只是$r.Matches中任何匹配项中任何组中值的数组。

这也解释了为什么[0]索引表达式可以工作-规则数组可以被索引成很好的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61972136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档