如何使用PowerShell和Regex以任意顺序从字符串中提取数据?

如何使用PowerShell和Regex以任意顺序从字符串中提取数据?,regex,powershell,Regex,Powershell,我正在尝试使用PowerShell和Regex解决此问题。我有一个字符串变量,如下所示: $input = @" Server Time: 4/13/2016 12:29 PM Username: RBullwinkle Lorem ipsum dolor Important Data: rosebud sit amet "@; 我希望提取数据,以便收到以下结果: $serverTime = "4/13/2016 12:29 PM" $userName = "RBullwinkle" $imp

我正在尝试使用PowerShell和Regex解决此问题。我有一个字符串变量,如下所示:

$input = @"
Server Time: 4/13/2016 12:29 PM
Username: RBullwinkle
Lorem ipsum dolor Important Data: rosebud sit amet
"@;
我希望提取数据,以便收到以下结果:

$serverTime = "4/13/2016 12:29 PM"
$userName = "RBullwinkle"
$important = "rosebud"
这将是一个简单的正则表达式,但以下情况除外:

  • 我希望提取对数据顺序的任何变化都具有鲁棒性
  • 我想在一次过程中处理输入字符串

  • 您可以使用.NETFramework正则表达式,它将允许您进行全局(第一次匹配时不返回)匹配,并结合替换来匹配您想要的内容。很容易显示(检查您的匹配信息),powershell命令可能是这样的(无可否认,我不是powershell的家伙):

    $myinput=@”
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    Lorem ipsum dolor重要数据:玫瑰花蕾
    "@
    $myotherinput=@”
    重要数据:水仙花很可爱
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    "@
    $pattern=“服务器\时间:\s?(?*)用户名:\s?(?*)重要\s数据:\s?(?\w+)
    $mymatches=[regex]::匹配($myinput,$pattern)
    $myothermatches=[regex]::匹配($myotherinput,$pattern)
    $mymatches | ForEach对象{if($\.Success){echo$\.value}
    #服务器时间:2016年4月13日下午12:29
    #用户名:RBullwinkle
    #重要数据:玫瑰花蕾
    $myothermatches | ForEach对象{if($\.Success){echo$\.value}
    #重要数据:水仙花
    #服务器时间:2016年4月13日下午12:29
    #用户名:RBullwinkle
    
    您可以使用.NET framework正则表达式进行全局(第一次匹配时不返回)匹配,并结合替换以匹配所需内容。很容易显示(检查您的匹配信息),powershell命令可能是这样的(无可否认,我不是powershell的家伙):

    $myinput=@”
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    Lorem ipsum dolor重要数据:玫瑰花蕾
    "@
    $myotherinput=@”
    重要数据:水仙花很可爱
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    "@
    $pattern=“服务器\时间:\s?(?*)用户名:\s?(?*)重要\s数据:\s?(?\w+)
    $mymatches=[regex]::匹配($myinput,$pattern)
    $myothermatches=[regex]::匹配($myotherinput,$pattern)
    $mymatches | ForEach对象{if($\.Success){echo$\.value}
    #服务器时间:2016年4月13日下午12:29
    #用户名:RBullwinkle
    #重要数据:玫瑰花蕾
    $myothermatches | ForEach对象{if($\.Success){echo$\.value}
    #重要数据:水仙花
    #服务器时间:2016年4月13日下午12:29
    #用户名:RBullwinkle
    
    正则表达式的工作归功于@swaver2112,但我想我应该添加它来展示一种将这些信息转换为powershell对象的方法

    $input1 = @'
    Server Time: 4/13/2016 12:29 PM
    Username: RBullwinkle
    Lorem ipsum dolor Important Data: rosebud sit amet
    '@
    
    $input2 = @'
    Lorem ipsum dolor Important Data: daffodils are lovely
    Server Time: 4/13/2016 12:29 PM
    Username: RBullwinkle
    '@
    
    $regex = 'Server\sTime:\s?(?<servertime>.*)|Username:\s?(?<username>.*)|Important\sData:\s?(?<importantdata>\w+)'
    $matches1 = [regex]::matches($input1, $regex)
    $matches2 = [regex]::matches($input2, $regex)
    
    $hash1 = @{}
    $matches1 | % {
        if ($_.Success) {
            $value = $_.value -split ': '
                $hash1.Add($value[0].trim(), $value[1].trim())
        }
    }
    
    $hash2 = @{}
    $matches2 | % {
        if ($_.Success) {
            $value = $_.value -split ': '
                $hash2.Add($value[0].trim(), $value[1].trim())
        }
    }
    
    [pscustomobject]$hash1, [pscustomobject]$hash2
    
    $input1=@'
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    Lorem ipsum dolor重要数据:玫瑰花蕾
    '@
    $input2=@'
    重要数据:水仙花很可爱
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    '@
    $regex='服务器\时间:\s?(?*)用户名:\s?(?*)重要数据:\s?(?\w+)
    $matches1=[regex]:匹配($input1,$regex)
    $matches2=[regex]:匹配($input2,$regex)
    $hash1=@{}
    $matches1 |%{
    如果($\成功){
    $value=$\.value-split':'
    $hash1.Add($value[0].trim(),$value[1].trim())
    }
    }
    $hash2=@{}
    $matches2 |%{
    如果($\成功){
    $value=$\.value-split':'
    $hash2.Add($value[0].trim(),$value[1].trim())
    }
    }
    [pscustomobject]$hash1,[pscustomobject]$hash2
    
    正则表达式的工作归功于@swaver2112,但我想我应该添加它来展示一种将这些信息转换为powershell对象的方法

    $input1 = @'
    Server Time: 4/13/2016 12:29 PM
    Username: RBullwinkle
    Lorem ipsum dolor Important Data: rosebud sit amet
    '@
    
    $input2 = @'
    Lorem ipsum dolor Important Data: daffodils are lovely
    Server Time: 4/13/2016 12:29 PM
    Username: RBullwinkle
    '@
    
    $regex = 'Server\sTime:\s?(?<servertime>.*)|Username:\s?(?<username>.*)|Important\sData:\s?(?<importantdata>\w+)'
    $matches1 = [regex]::matches($input1, $regex)
    $matches2 = [regex]::matches($input2, $regex)
    
    $hash1 = @{}
    $matches1 | % {
        if ($_.Success) {
            $value = $_.value -split ': '
                $hash1.Add($value[0].trim(), $value[1].trim())
        }
    }
    
    $hash2 = @{}
    $matches2 | % {
        if ($_.Success) {
            $value = $_.value -split ': '
                $hash2.Add($value[0].trim(), $value[1].trim())
        }
    }
    
    [pscustomobject]$hash1, [pscustomobject]$hash2
    
    $input1=@'
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    Lorem ipsum dolor重要数据:玫瑰花蕾
    '@
    $input2=@'
    重要数据:水仙花很可爱
    服务器时间:2016年4月13日下午12:29
    用户名:RBullwinkle
    '@
    $regex='服务器\时间:\s?(?*)用户名:\s?(?*)重要数据:\s?(?\w+)
    $matches1=[regex]:匹配($input1,$regex)
    $matches2=[regex]:匹配($input2,$regex)
    $hash1=@{}
    $matches1 |%{
    如果($\成功){
    $value=$\.value-split':'
    $hash1.Add($value[0].trim(),$value[1].trim())
    }
    }
    $hash2=@{}
    $matches2 |%{
    如果($\成功){
    $value=$\.value-split':'
    $hash2.Add($value[0].trim(),$value[1].trim())
    }
    }
    [pscustomobject]$hash1,[pscustomobject]$hash2
    
    对于这种结构良好的数据,请使用
    convertfromstringdata
    。你可以用很少的正则表达式来实现。只需要将:改为=就可以了。我有几篇关于这种方法的帖子。对于这种结构良好的数据,请使用
    convertfromstringdata
    。你可以用很少的正则表达式来实现。只需要将:改为=就可以了。我有一些关于这种方法的帖子。