正则表达式 – 如何从Select-String获取捕获的组?

我正在使用Power shell(版本4)从 Windows上的一组文件提取文本:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table

到现在为止还挺好.这给了一组很好的MatchInfo对象:

IgnoreCase                    LineNumber Line                          Filename                      Pattern                       Matches
----------                    ---------- ----                          --------                      -------                       -------
    True                            30   ...                           file.jsp                      ...                           {...}

接下来,我看到捕获是在比赛成员,所以我把他们:

PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table

这使:

Groups        Success Captures                 Index     Length Value
------        ------- --------                 -----     ------ -----
{...}         True    {...}                    49        47     ...

或与…列表格式列表:

Groups   : {matched text,captured group}
Success  : True
Captures : {matched text}
Index    : 39
Length   : 33
Value    : matched text

这里是我停止的地方,我不知道如何进一步,并获得捕获的组元素的列表.

我试过添加另一个| ForEach-Object -MemberName组,但它似乎返回与上述相同.

我最接近的是|选择对象 – 属性组,这确实给了我所期望的(集合列表):

Groups
------
{matched text,captured group}
{matched text,captured group}
...

但是,我无法从每个人中提取捕获的组,我尝试使用| Select-Object -Index 1我只得到其中一个集合.

更新:一个可能的解决方

似乎加入| ForEach-Object {$_.Groups.Groups [1] .Value}我得到了我正在寻找的东西,但是我不明白为什么 – 所以我无法确定我能够在扩展时获得正确的结果这种方法对整套文件.

为什么它工作?

作为附注,这个| ForEach-Object {$_.Groups [1] .Value}(即没有第二个.Groups)给出相同的结果.

我想补充一点,经过进一步的尝试,似乎可以通过删除管道缩短命令Select-Object -Property组.

看看下面的内容
$a = "http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$'

$a现在是一个MatchInfo($a.gettype()),它包含一个Matches属性.

PS ps:\> $a.Matches
Groups   : {http://192.168.3.114:8080/compierews/,192.168.3.114,compierews}
Success  : True
Captures : {http://192.168.3.114:8080/compierews/}
Index    : 0
Length   : 37
Value    : http://192.168.3.114:8080/compierews/

在小组成员中你会发现你正在寻找的,所以你可以写:

"http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$'  | % {"IP is $($_.matches.groups[1]) and path is $($_.matches.groups[2])"}

IP is 192.168.3.114 and path is compierews

相关文章

一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^d{n}$ 3 至少n位的数字:^d{n,}$ 4 m-n位的数字...
正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。下面整理一些常用的正则...
0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的...
 正则表达式是从信息中搜索特定的模式的一把瑞士军刀。它们是一个巨大的工具库,其中的一些功能经常...
一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数...
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n...