我正在尝试在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,
答案 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次否定的字符类而不匹配逗号或冒号,并断言右边的内容是逗号或字符串的结尾:
[^:,]+:[^:,]+(?=,|$)
如果您也不想匹配/
,则可以将其添加到字符类中:
[^:,/]+:[^:,/]+(?=,|$)
答案 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