h41msh1c0r
Goto Top

Powershell Regex mag nicht

Hi@All,

Ich habe mehrere Einträge "<text aaa>-b-cc1<1>" und "<aaa>-b-cc1<1>"

"< >" kennzeichnen die variablen Anteile

$liste = $doc.SelectNodes("//Object") |  Where-Object {($_.Name -like '*-b-cc1*')}  | %{$_.Name} | %{ $_ -Replace '^.*([a-z]{3}-b-cc1[1-4])$','$1' } | Sort-Object -Unique  
$liste

Jetzt bekomme ich auch meine Liste, leider mit zuviel Inhalt

text aaa-b-cc11
text aaa-b-cc11
text aaa-b-cc12
www-b-cc13
zzz-b-cc14
text aaa-b-cc11
www-b-cc13

aussehen sollte sie folgendermaßen:

aaa-b-cc11
aaa-b-cc12
www-b-cc13
zzz-b-cc14

Laut Simulator läuft der RegEx.

Wo liegt mein Denkfehler?

VG

Content-Key: 350252

Url: https://administrator.de/contentid/350252

Printed on: April 25, 2024 at 02:04 o'clock

Mitglied: 133883
133883 Sep 27, 2017 updated at 16:38:39 (UTC)
Goto Top
Du verwendest mit $_.Name ein Object statt einem expandiertem String.
Schau dir die Objekte mit Get-Member auf der Konsole mal genau an.

Gruß
Member: H41mSh1C0R
H41mSh1C0R Sep 28, 2017 at 08:11:25 (UTC)
Goto Top
Moin Oneplus,

schonmal danke für den Tipp.

$liste = $doc.SelectNodes("//NCPObject") |  Where-Object {($_.Name -like '*-b-cc1*')}  | % { $_.Name} | Get-Member  

$liste = $doc.SelectNodes("//NCPObject") |  Where-Object {($_.Name -like '*-b-cc1*')}  | Select-Object -ExpandProperty Name | Get-Member  

Wenn ich das Get-Member gibt es auch die gleiche Ergebnisliste.

Bei beiden Varianten bekommeich am Ende das gleiche Ergebnis: TypeName: System.String

Ist es nicht Sinn und Zweck mit Objekten zu arbeiten, wenn die Pipe benutzt wird?

Mit folgender Zeile bekomme ich die Liste im gewünschten Format allerdings ist das eine Krücke:

$liste = $doc.SelectNodes("//NCPObject") |  Where-Object {($_.Name -like '*-b-cc1*')}  |  % { $_.Name } | % { ([String]$_).Replace("text ","")} | Sort-Object -Unique  

Mit dem RegEx wäre ihm alles im String egal außer der Block des korrekten Names.

Hier noch eine Variante mit ExpandProperty:
$liste = $doc.SelectNodes("//NCPObject") |  Where-Object {($_.Name -like '*-b-cc1*')}  | Select-Object -ExpandProperty Name | %{  
if($_.Length -gt 10){
    ($_).Substring(5,10)
}
} | Sort-Object -Unique

Witzigerweise kommen hier weniger Namen in die Liste, irgendwo fallen da welche vom Tisch, obwohl der Part der als Substring übrig bleibt passt.

Leider rennt bei keiner Variante der RegEx so wie er soll. ;(

VG
Member: H41mSh1C0R
H41mSh1C0R Sep 28, 2017 at 11:01:00 (UTC)
Goto Top
Neuer Versuch das runterzubrechen hat funktioniert. =)
$result = ''  

$input = @('aaa-b-cc11';'aaa-b-cc12';'aaa-b-cc14';'vvv-b-cc11';'test (rrr-b-cc11)')  
$input

Write-Host '-------------------'  

$result = @()

foreach($value in $input){

#$value.Length

if($value.Length -gt 10){

     if($value -match '\((.*)\)'){  
     
     $new = $result += $matches[1]
     }
}else{
     $new = $result += $value.ToString()
}
}

$new

Ausgabe
aaa-b-cc11
aaa-b-cc12
aaa-b-cc14
vvv-b-cc11
test (rrr-b-cc11)
-------------------
aaa-b-cc11
aaa-b-cc12
aaa-b-cc14
vvv-b-cc11
rrr-b-cc11

Läuft =)