使用Powershell从字符串获取键值

时间:2019-05-30 10:15:51

标签: regex powershell

我正在尝试在Powershell中使用Regex获取键值。

$string = "key1:value1,key2:value2,key3:value3"
$name = [Regex]::Matches($string, ':([^/]+),') | Select -ExpandProperty Value
Write-Host "Name :" $name

我想要这样的输出:

$key1 = "value1"
$key2 = "value2"
$key3 = "value3"

我得到的输出:

Name : :value1,key2:value2,

4 个答案:

答案 0 :(得分:4)

如果您使用逗号分隔key:value对,这应该可以满足您的要求。

$string = "key1:value1,key2:value2,key3:value3"
$ht = @{} # declare empty hashtable
$string -split ',' | % { $s = $_ -split ':'; $ht += @{$s[0] =  $s[1]}} 
# split the string by ',', then split each new string on ':' and map them to the hashtable

输出以下内容(默认情况下,它们未排序)

PS C:\> $ht

Name                           Value
----                           -----
key3                           value3
key1                           value1
key2                           value2

答案 1 :(得分:3)

非常确定sysg0blin的helpful answer可以完成这项工作,但是如果您真的想设置特定的变量,可以使用以下脚本来完成:

$string = "key1:value1,key2:value2,key3:value3"
$splitted = $string -split ','
$splitted | ForEach-Object {
  $i = $_ -split ":"
  Set-Variable -Name $i[0] -Value $i[1]
}

您要做的是将字符串拆分为key:value对数组,然后将每对拆分为包含2个元素的数组,第一个是变量名,第二个是变量的值。

答案 2 :(得分:1)

您之所以会得到匹配,是因为在:[^/]+还将匹配:,之前没有匹配项。

因此您的模式将首先匹配:,然后将不匹配/,然后回溯,直到可以匹配,

您可以使用2次否定的字符类而不匹配逗号或冒号,并断言右边的内容是逗号或字符串的结尾:

[^:,]+:[^:,]+(?=,|$)

Regex demo

如果您也不想匹配/,则可以将其添加到字符类中:

[^:,/]+:[^:,/]+(?=,|$)

答案 3 :(得分:0)

我看到您已经回答了您,但是这里还有另一种方法。

("key1:value1,key2:value2,key3:value3").Split(',') | 
%{$PSItem | ConvertFrom-Csv -Delimiter ':' -Header Name, Value}

# Results

Name Value 
---- ----- 
key1 value1
key2 value2
key3 value3