2016-04-13 10 views
0

Bu sorunu PowerShell ve Regex kullanarak çözmeye çalışıyorum. Ben aşağıdaki gibi bir dize değişkeni vardır:Bir dizgeden PowerShell ve Regex'i kullanarak herhangi bir sırada nasıl veri alabilirim?

$input = @" 
Server Time: 4/13/2016 12:29 PM 
Username: RBullwinkle 
Lorem ipsum dolor Important Data: rosebud sit amet 
"@; 

Ben veri ayıklamak istiyorum böyle ben şu sonucu alırsınız:

$serverTime = "4/13/2016 12:29 PM" 
$userName = "RBullwinkle" 
$important = "rosebud" 

Bu aşağıdaki komplikasyonlar dışında basit bir regex olacaktır:

  1. Ekstraksiyonun, verilerin sırasındaki değişikliklere karşı sağlam olmasını isterim.
  2. Giriş dizesini tek bir geçişte işlemek istiyorum.
+1

Bu şekilde yapılandırılmış veriler için 'ConvertFrom-StringData' işlevini kullanın. Bunu çok az regex ile yapabilirsin. Sadece değiştirmek gerekir: = = ve çalışması gerekir. Bu yaklaşım hakkında birkaç mesajım var. – Matt

cevap

1

kredi regex çalışmaları için @ sweaver2112 gider, ama: Regex demo kolayca (eşleme bilgileri kontrol), powershell komutları böyle bir şey (kuşkusuz, bir powershell adam değilim) olabilir gösterilmektedir Bu bilgiyi bir powershell nesnesine dönüştürmenin bir yolunu göstermek istediğimi düşündüm

$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 
1

.NET framework düzenli ifadelerini kullanarak, global bir (ilk eşleşmeden dönme) eşleşmesini, istediğinizle eşleşecek şekilde birleştirme yapmanıza izin verebilirsiniz.

$myinput = @" 
Server Time: 4/13/2016 12:29 PM 
Username: RBullwinkle 
Lorem ipsum dolor Important Data: rosebud sit amet 
"@ 
$myotherinput = @" 
Lorem ipsum dolor Important Data: daffodils are lovely 
Server Time: 4/13/2016 12:29 PM 
Username: RBullwinkle 
"@ 

$pattern = "Server\sTime:\s?(?<servertime>.*)|Username:\s?(?<username>.*)|Important\sData:\s?(?<importantdata>\w+)" 
$mymatches = [regex]::matches($myinput, $pattern) 
$myothermatches = [regex]::matches($myotherinput, $pattern) 

$mymatches | ForEach-Object { if ($_.Success) { echo $_.value}} 

#Server Time: 4/13/2016 12:29 PM 
#Username: RBullwinkle 
#Important Data: rosebud 

$myothermatches | ForEach-Object { if ($_.Success) { echo $_.value}} 

#Important Data: daffodils 
#Server Time: 4/13/2016 12:29 PM 
#Username: RBullwinkle 
İlgili konular