如何为每个匹配生成唯一Guids

Ter*_*nce 1 regex powershell guid

我正在尝试编写一个在找到匹配项时生成新GUID的脚本.我的问题是我一直为所有匹配生成相同的GUID.如何在不为所有匹配项生成相同GUID的情况下执行此操作?

$testString = @"
    [assembly: Guid Should Replace]
    [assembly: Guid Should Replace]    
    [assembly: Guid Should Replace]
"@
    #expected output
    #[assembly: "unique guid"]


    function ReplaceWithNewGuid {
        param($content)
        $retval = ($content -ireplace '(?m)(\[assembly: Guid.*$)+', "[assembly: Guid(`"$([guid]::NewGuid())`"]`)")
        return $retval
    }

    ReplaceWithNewGuid($testString)
Run Code Online (Sandbox Code Playgroud)

实际输出示例:

[议会:Guid("29e784aa-ba4a-4a45-85b8-d6b52916b539"])

[议会:Guid("29e784aa-ba4a-4a45-85b8-d6b52916b539"])

[议会:Guid("29e784aa-ba4a-4a45-85b8-d6b52916b539"])

更新

@Mathias R. Jessen的答案帮助我得到了我需要的东西.我想我可以在powershell中使用.net框架库来实现这一点但是,这可以按预期工作.

function ReplaceWithNewGuid {
    param($content)
    $retval = [regex]::Replace($testString, '(?m)(\[assembly: Guid.*$)+', {param($m) return "[assembly: Guid(`""+ (New-Guid).Guid + "`")]"}, 'IgnoreCase')
    return $retval
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 5

您可以Regex.Replace()直接使用,允许您传递一个scriptblock来代替MatchEvaluator委托参数:

$testString = @"
[assembly: Guid Should Replace]
[assembly: Guid Should Replace]    
[assembly: Guid Should Replace]
"@

[regex]::Replace($testString, 'Guid Should Replace', {param($m) return (New-Guid).Guid}, 'IgnoreCase')
Run Code Online (Sandbox Code Playgroud)

您应该看到它返回3个不同的标识符