使用正则表达式在Powershell中的给定字符串中获取=之后的值

时间:2014-07-21 09:31:37

标签: regex powershell

我有一个字符串,如下所示

$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

但不幸的是,我从命令上获得了空值。我遇到了什么问题?

4 个答案:

答案 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]
}

<强>解释

  • lookbehind (?<=PTSKKV = )声称前面的内容是PTSKKV
  • \S+匹配任何非空白字符

<强>参考

答案 3 :(得分:0)

这将匹配第一个空格字符之前的值 只需将PTSKKV替换为您搜索的值的名称。

(?<=PTSKKV[\s]*?=[\s]*?)[^\s]+