Powershell,你做了多少替补?

Jus*_* R. 7 replace powershell-2.0

我需要知道Powershell在使用-replace操作符或Replace()方法时有多少替换.或者,如果这不可能,如果它完全取代了.

例如,在Perl中,因为替换操作返回所做的替换次数,并且零为false,而在布尔上下文中非零为真,可以写:

$greeting = "Hello, Earthlings";
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." }
Run Code Online (Sandbox Code Playgroud)

但是使用Powershell,运算符和方法返回新字符串.看起来运营商提供了一些额外的信息,如果有人知道如何要求它(例如,捕获的组存储在它在当前范围内创建的新变量),但我无法找到如何获得计数或成功价值.

我可以比较前后值,但这似乎完全没有效率.

Jam*_*ack 8

你是对的,我不认为你可以挤出任何额外的东西.但是,您可以使用Regex.Matches()找到匹配数.例如

> $greeting = "Hello, Earthlings"
> $needle = "l"
> $([regex]::matches($greeting, $needle)).Length # cast explicitly to an array
3
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用使用相同匹配引擎的-replace运算符.


在深入了解之后,有一个Replace的重载,它接受一个MatchEvaluator委托,每次匹配时都会调用它.因此,如果我们将其用作累加器,它可以一次性计算替换次数.

> $count = 0
> $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{$count ++}
> [regex]::Replace("Hello, Earthlings","l",$matchEvaluator)
> $count
Heo, Earthings
3
Run Code Online (Sandbox Code Playgroud)

  • 我发现这是因为Windows Management Framework 3发行说明中记录了一个更改:"作为委托执行的脚本块在自己的范围内运行".使$ count全局解决问题. (2认同)