2015-06-05 78 views
4

我試圖替換Powershell中的部分字符串。使用Powershell中的函數替換

$text = "the image is -12345-" 
$text = $text -replace "-(\d*)-", 'This is the image: $1' 
Write-Host $text 

這給了我正確的結果: 「這是圖像:12345」然而,替換字符串沒有硬編碼的,它是從一個函數計算

現在,我想包括以base64編碼的圖像。我可以從ID讀取圖像。我希望下面的工作,但它並不:

function Get-Base64($path) 
{ 
    [convert]::ToBase64String((get-content $path -encoding byte)) 
} 
$text -replace "-(\d*)-", "This is the image: $(Get-Base64 '$1')" 

的原因,這是行不通的,是因爲它首先通過$1(字符串,而不是$1值)的功能,執行它,然後才執行替換。我想要做的就是

  • 查找模式
  • 的發生與模式
  • 對於每個替換每次出現時替換:
  • 傳遞捕獲組的功能
  • 使用值的捕獲組獲得base64映像
  • 將base64映像注入到替換中

回答

10

您可以使用靜態Replace方法從[regex]類:

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

或者你可以定義一個regex對象,並使用該對象的Replace方法:

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

爲了更好的可讀性,你可以定義回調函數(scriptblock)在一個單獨的變量中並用於替換:

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

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

對於那些希望瞭解其推導的人,它使用'Replace'方法的標記([Regex.Replace方法(String,MatchEvaluator)](https://msdn.microsoft.com/en-us/library /cft8645c%28v=vs.110%29.aspx)),通過允許對匹配的參數進行計算,爲正則表達式增加了更多的功能。整潔的事情是 - 我直到看到這個答案時才意識到 - 是一個PowerShell腳本塊顯然與MatchEvaluator參數兼容! –