我需要知道在使用-replace
运算符或Replace()
方法时,Powershell会进行多少次替换。或者,如果这不可能,如果它完全取代了。
例如,在Perl中,因为替换操作返回所做的替换次数,并且零为false,而在布尔上下文中非零为真,可以写:
$greeting = "Hello, Earthlings";
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." }
然而,使用Powershell,运算符和方法返回新字符串。看起来运营商提供了一些额外的信息,如果有人知道如何要求它(例如,捕获的组存储在它在当前范围内创建的新变量),但我无法找到如何获得计数或成功价值。
我可以比较之前和之后的值,但这似乎完全没有效率。
答案 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