Powershell,你做了多少替补?

时间:2010-02-27 00:46:34

标签: replace powershell-v2.0

我需要知道在使用-replace运算符或Replace()方法时,Powershell会进行多少次替换。或者,如果这不可能,如果它完全取代了。

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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


稍微深一点后,有一个Replace的重载,它需要一个MatchEvaluator委托,每次匹配时都会调用它。因此,如果我们将其用作累加器,它可以一次性计算替换次数。

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

答案 1 :(得分: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

答案 2 :(得分:0)

这里有一个完整的功能示例,其中保留了替换行为并计算了匹配数

$Script:Count = 0
$Result = [regex]::Replace($InputText, $Regex, [System.Text.RegularExpressions.MatchEvaluator] {  
        param($Match)
        $Script:Count++
        return $Match.Result($Replacement)
    })

答案 3 :(得分:0)

以上答案实际上都不是在最近的 PS 版本中进行替换和工作的: James Kolpack - 展示如何计算已删除的正则表达式(未替换); Kino101 - 不完整的答案,未定义变量; Annarfych - 过时的答案,在最近的 PS 版本中,评估器计数变量需要是全局的

以下是如何进行替换和计数:

$String = "Hello World"
$Regex = "l|o" #search for 'l' or 'o'
$ReplaceWith = "?"
$Count = 0

$Result = [regex]::Replace($String, $Regex, { param($found); $Global:Count++; return $found.Result($ReplaceWith) })

$Result
$Count

在 Powershell 5.1 中的结果:

<块引用>

他??? W?r?d

<块引用>

5