2010-02-27 18 views
6

当使用-replace运算符或Replace()方法时,我需要知道Powershell进行了多少次替换。或者,如果这是不可能的,是否可以替代。Powershell,你做了多少替代品?

例如,在Perl中,因为替换操作返回由替换的数目和零是假,而非零是在布尔上下文真,一个可以写成:

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

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

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

回答

8

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

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

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


看深入一点之后,还有哪些需要MatchEvaluator代表这是一个匹配时每次更换所谓的过载。所以,如果我们使用它作为累加器,它可以一次计算替换次数。

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

的最佳解决方案! – 2010-02-27 02:13:13

+0

这对PS 3/Windows 8中的我不起作用。替换工作,但$ count为0.但是,当我在PS 2模拟中运行时(通过powershell -version 2)它工作正常。 – bart 2013-05-02 23:07:15

+2

我发现这是因为Windows Management Framework 3发行说明中记录的更改:“以代理身份执行的脚本块在其自己的作用域中运行”。让$ count全局解决了这个问题。 – bart 2013-05-02 23:29:48

0

脚本的版本,实际上不更换的东西,而不是空他们:

$greeting = "Hello, earthlings. Mars greeting ready" 
$counter = 0 
$search = '\s' 
$replace = '' 
$evaluator = [System.Text.RegularExpressions.MatchEvaluator] { 
    param($found) 
    $counter++ 
    Write-Output ([regex]::Replace($found, [regex] $search, $replace)) 
} 

[regex]::Replace($greeting, [regex] $search, $evaluator); 
$counter 

- >

> Hello,earthlings.Marsgreetingready 
> 4