powershell 如何只捕获包含在括号中的子字符串?

fnvucqvd  于 2023-04-30  发布在  Shell
关注(0)|答案(2)|浏览(135)
$String = @'
the fox [GO Here] jumped up
HERE
Using [IMB](www.IMB.com)
Using [Xerox](www.Xerox.com)
Using [Banana](www.Banana.com)
the fox [GO Here] jumped up
'@

$String -replace "\[(.*?)\]\(", "$1"

我得到的输出是:

the fox  jumped up
Using (www.foxtrot.com)
Using (www.IMB.com)
Using (www.Xerox.com)
Using (www.Banana.com)
the fox  jumped up

我期待得到的是:

IMB
Xerox
Banana

根据RexEx101,这是有效的。我的RegEx foo一点也不强,所以很可能是我的错。

8zzbczxx

8zzbczxx1#

实现您所需功能的最简单方法是直接使用API call

[regex]::Matches($String, '\[(.*?)\]\(') |
    ForEach-Object { $_.Groups[1].Value }

Select-String -AllMatches

($String | Select-String -Pattern '\[(.*?)\]\(' -AllMatches).Matches |
    ForEach-Object { $_.Groups[1].Value }
1cklez4t

1cklez4t2#

您需要一个正后向Assert(?<=\[)和正前向Assert(?=\]\()来只匹配您想要的部分。

$String = @'
the fox [GO Here] jumped up
HERE
Using [IMB](www.IMB.com)
Using [Xerox](www.Xerox.com)
Using [Banana](www.Banana.com)
the fox [GO Here] jumped up
'@

([regex]::Matches($String, '(?<=\[)(.*?)(?=\]\()')).Value

输出:

IMB
Xerox
Banana

相关问题