我有一个字符串,如下所示
$string1 = "PTSKKV = 3.5 PTSPK = 4.6"
如果我提供" PTSKKV"我尝试写一个正则表达式来获取值3.5。 4.6如果我提供" PTSPK"如下所示
[System.Text.RegularExpressions.Regex]::Matches($string1 , "(?<=PTSKKV\s*=\s*)[^\s]+").Value
[System.Text.RegularExpressions.Regex]::Matches($string1 , "(?<=PTSPK\s*=\s*)[^\s]+").Value
但不幸的是,我从命令上获得了空值。我遇到了什么问题?
答案 0 :(得分:2)
不确定您的实际目标是什么,但如果您希望能够在该字符串中查找特定键的值,我可能会使用完全不同的方法。
使用换行符替换键/值对之间的空格,然后将字符串转换为哈希表。之后,您只需通过各自的键访问每个值:
PS C:\> $s = "PTSKKV = 3.5 PTSPK = 4.6"
PS C:\> $h = ($s -replace '\s\s+',"`n") | ConvertFrom-StringData
PS C:\> $h
Name Value
---- -----
PTSPK 4.6
PTSKKV 3.5
PS C:\> $v = 'PTSPK'
PS C:\> $h[$v]
4.6
答案 1 :(得分:0)
某些语言在后备广告中不会支持*
,+
,?
。所以你的正则表达式会是,
[System.Text.RegularExpressions.Regex]::Matches($string1 , "(?<=PTSKKV\s=\s)[^\s]+").Value
[System.Text.RegularExpressions.Regex]::Matches($string1 , "(?<=PTSPK\s=\s)[^\s]+").Value
<强>解释强>
(?<=PTSKKV\s=\s)
Lookbehind将匹配标记设置在字符串PTSKKV =
[^\s]+
匹配一个或多个非空格字符。答案 2 :(得分:0)
您可以使用:
if ($subject -cmatch '(?<=PTSKKV = )\S+') {
$result = $matches[0]
}
对于另一个,只需将PTSKKV
替换为PTSPK
即可。
选项2:在单次传递中检索两者
if ($subject -cmatch 'PTSKKV = (\S+)\s*PTSPK = (\S+)') {
$ptskkv = $matches[1]
$ptspk = $matches[2]
}
<强>解释强>
(?<=PTSKKV = )
声称前面的内容是PTSKKV
\S+
匹配任何非空白字符<强>参考强>
答案 3 :(得分:0)
这将匹配第一个空格字符之前的值 只需将PTSKKV替换为您搜索的值的名称。
(?<=PTSKKV[\s]*?=[\s]*?)[^\s]+