首页 > 解决方案 > PowerShell 5 和 7 之间的正则表达式区别

问题描述

我有一个在 PS5 和 PS7 上返回不同的正则表达式。运行此代码:

$ipres      = Invoke-WebRequest -Method GET -Uri 'https://raw.githubusercontent.com/SecOps-Institute/Tor-IP-Addresses/master/tor-exit-nodes.lst'
$iplist     = $ipres.Content.Split([Environment]::NewLine)

$iplist_v4  = $iplist | Where-Object { $_ -match '^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$' } 
$iplist_v6  = $iplist | Where-Object { $_ -notmatch '^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$' } 

给出不同的结果:
PSVersion 5.1.22494.1000
PSVersion 7.2.0

正是正则表达式使一切变得不同。
PSversion5返回“按预期”。PSversion7什么都没有
IPv6 列表包含“所有内容”。

这里的搭档是我将把它部署为 Azure 函数,因此我必须让它在PSversion7.

编辑:

谢谢@DavidBrabant,您测试并暗示我它应该可以工作。打印 $iplist 变量是我的错误,我应该数一数

$iplist.count

然后我会看到它包含在一个项目中,但是在打印它们时它显示为预期结果(几个项目)。在正则表达式上运行它是没有意义的,只有一项是正则表达式的响应如此奇怪的原因。

$iplist     = $ipres.Content.Split("`n")

为 PS7 制作了 trix 并在 PS5 上工作。

这就提出了一个问题,[Environment]::NewLine 是根本原因吗?

标签: regexpowershell-5.0powershell-7.0

解决方案


发布这个,所以我可以关闭这个问题。
PS5 和 PS7 之间的区别在于 [Environment]::NewLine,而不是正则表达式在不同 PowerShell 版本上的行为。

$iplist     = $ipres.Content.Split("`n")

解决了它并适用于 PS5 和 PS7


推荐阅读