7

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

例如,在 Perl 中,因为替换操作返回进行的替换次数,在布尔上下文中,零为假,非零为真,可以这样写:

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

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

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

4

4 回答 4

8

你是对的,我认为你不能从 -replace 中挤出任何额外的东西。但是,您可以使用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
于 2010-02-27T01:09:11.453 回答
1

以上答案实际上都不是替换并在最近的 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

于 2021-04-03T15:47:50.543 回答
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
于 2016-10-31T18:01:20.770 回答
0

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

$Script:Count = 0
$Result = [regex]::Replace($InputText, $Regex, [System.Text.RegularExpressions.MatchEvaluator] {  
        param($Match)
        $Script:Count++
        return $Match.Result($Replacement)
    })
于 2019-05-21T14:58:49.230 回答