Use a function in Powershell replace

PetSerAl's helpful answer is your only option in Windows PowerShell, as of v5.1.

PowerShell Core v6.1+ now offers a native PowerShell solution via an enhancement to the
-replace operator
, which obviates the need to call [regex]::Replace():

Just as with [regex]::Replace(), you can now:

  • pass a script block as the -replace replacement operand, which must return the replacement string,
  • except that the match at hand (an instance of type [System.Text.RegularExpressions.Match]) is represented as automatic variable $_, as is customary in PowerShell.

Applied to your case:

$text -replace "-(\d*)-", { "This is the image: $(Get-Base64 $_.Groups[1].Value)" }

A simpler example:

# Increment the number embedded in a string:
PS> '42 years old' -replace '\d+', { [int] $_.Value + 1 }
43 years old

You can use the static Replace method from the [regex] class:

[regex]::Replace($text,'-(\d*)-',{param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})

Alternatively you can define a regex object and use the Replace method of that object:

$re = [regex]'-(\d*)-'
$re.Replace($text, {param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})

For better readability you could define the callback function (the scriptblock) in a separate variable and use that in the replacement:

$callback = {
  param($match)
  'This is the image: ' + (Get-Base64 $match.Groups[1].Value)
}

$re = [regex]'-(\d*)-'
$re.Replace($text, $callback)

Here's another way. Use the -match operator, and then reference $matches. Note that $matches doesn't get set with arrays on the left side of the -match operator. $matches.1 is the first grouping formed by the ( ).

$text = "the image is -12345-"
function Get-Base64($path) { 
  [convert]::ToBase64String( (get-content $path -asbytestream) ) }  # ps 6 ver
if (! (test-path 12345)) { echo hi > 12345 }
$text -match '-(\d*)-'
$text -replace '-(\d*)-', "$(Get-Base64 $matches.1)"

the image is aGkNCg==

Or to break it up even more:

$text -match '-(\d*)-'
$result = Get-Base64 $matches.1
$text -replace '-(\d*)-', $result