【问题标题】:select everything inside curly bracket选择大括号内的所有内容
【发布时间】:2017-09-23 15:28:06
【问题描述】:

我们可以得到结果吗

edf560af-db87-11e3-80d2-806e6f6e6963
faadf429-db69-11e3-919f-e0db55bf0b1b

试过了

(Get-WmiObject Win32_Volume |select  deviceid) -replace '\D'
# removes all except numbers

这里是命令

Get-WmiObject Win32_Volume |select  deviceid

deviceid                                                                                                                                                                               
--------                                                                                                                                                                               
\\?\Volume{edf560af-db87-11e3-80d2-806e6f6e6963}\                                                                                                                                      
\\?\Volume{faadf429-db69-11e3-919f-e0db55bf0b1b}\                                                                                                                                      
\\?\Volume{faadf42d-db69-11e3-919f-e0db55bf0b1b}\                                                                                                                                      
\\?\Volume{faadf433-db69-11e3-919f-e0db55bf0b1b}\                                                                                                                                      
\\?\Volume{faadf439-db69-11e3-919f-e0db55bf0b1b}\                                                                                                                                      
\\?\Volume{edf560b0-db87-11e3-80d2-806e6f6e6963}\                                                                                                                                      
\\?\Volume{edf560b1-db87-11e3-80d2-806e6f6e6963}\                                                                                                                                      
\\?\Volume{edf560b5-db87-11e3-80d2-806e6f6e6963}\  

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    试试这个正则表达式:

    (?<=(Volume{))([\s\S]| |w\[0-9]| )+?(?=(}))
    or simpler
    (?<=Volume{).+(?=})
    

    https://regex101.com/r/MHnxxh/4 或者 https://regex101.com/r/MHnxxh/5

    【讨论】:

      【解决方案2】:

      即使您尝试的变体也无法工作,因为它还会在卷中包含e

      PS> (Get-WmiObject Win32_Volume |select  -expand deviceid) -replace '[^0-9a-f]'
      ed0addcdf000000000000100000000000
      ed0addcdf000000000000501f00000000
      e775fc6ae9c7511e7b58e10604b928269
      e2367fe0e45e311e6b548806e6f6e6963
      

      这里使用lookarounds 的另一个工作解决方案:

      Get-WmiObject Win32_Volume | Select-String '(?<=\{)[0-9a-f\-]+(?=\})' | ForEach-Object {$_.matches.value}
      

      【讨论】:

      • 第一个建议保留 Volume 中的 e(注意生成的字符串是 33,而不是 32 个字符宽)
      【解决方案3】:

      您似乎只想捕获左大括号和右大括号之间的十六进制数字。

      PS C:\src\t> cat .\dsm.ps1
      Get-CimInstance CIM_StorageVolume |
          Select-Object DeviceID |
          ForEach-Object { $_ -match ".*{([-0-9a-fA-F]*)}.*" } |
          ForEach-Object { $matches[1] -replace '-' }
      

      输出是:

      PS C:\src\t> .\dsm.ps1
      04ec358ff8bc11e3bac6806e6f6e6963
      04ec3590f8bc11e3bac6806e6f6e6963
      2bd2c32a00000000000090b4e8000000
      c0adb44bbbcc11e5b3e7806e6f6e6963
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2017-04-19
        • 2010-10-18
        相关资源
        最近更新 更多