Erstes Element im Array ist leer
Guten Abend zusammen,
ich verzweifle an einer Regular Expression in einem Powershell Skript.
Es handelt sich um Windows 10 (Version 10.0.14393) und somit um Powershell 5.1.
Es gibt diese Zeile:
Nun splitte ich den String mit Hilfe eines Regulären Ausdrucks:
Das Ergebnis sieht so aus:
Warum steht in Feld nicht die Zahl 5 ? Stattdessen ist dieses leer.
In anderen Sprachen (z.B. C++, C#) steht in Feld die 5 drin.
Gruß,
Dani
ich verzweifle an einer Regular Expression in einem Powershell Skript.
Es handelt sich um Windows 10 (Version 10.0.14393) und somit um Powershell 5.1.
Es gibt diese Zeile:
...
[string] $strTitle = "5 Welten"
...
[array] $aResult = $strTitle -split "^(\d[A-Za-z]{0,10})"
#Testausgabe
foreach($ele in $aResult) {
Write-Host "|$ele|"
}
Das Ergebnis sieht so aus:
||
|5|
| Welten|
In anderen Sprachen (z.B. C++, C#) steht in Feld die 5 drin.
Gruß,
Dani
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 314943
Url: https://administrator.de/forum/erstes-element-im-array-ist-leer-314943.html
Ausgedruckt am: 01.04.2025 um 22:04 Uhr
7 Kommentare
Neuester Kommentar

Hi
No, that's correct. In this case your split pattern ist the single number 5. So the engine splits the string at the 5 which results in an empty first array element (the beginning ^).
Test it yourself here:
https://www.myregextester.com/index.php
Regards
No, that's correct. In this case your split pattern ist the single number 5. So the engine splits the string at the 5 which results in an empty first array element (the beginning ^).
Test it yourself here:
https://www.myregextester.com/index.php
Regards
Hallo Dani,
die Frage ist doch erst mal was willst du mit dem Regex eigentlich letztendlich erreichen?
Ein Regex ^(\d[A-Za-z]{0,10}) matcht ja eine einzelne Zahl gefolgt von 0 bis 10 Buchstaben.(p.s. das A-Z also die Erwähnung von Großbuchstaben ist hier nicht erforderlich da Regex in Powershell bei der Verwendung der Operatoren -split und -match per default case insensitive sind, das nur nebenbei bemerkt.)
Bei deinem String "5 Welten" wird hier also nur die 5 als alleiniger Splitter gematcht, da ja ein Leerzeichen folgt und kein Buchstabe. Das Setzen der Klammern bewirkt ja das der Splitter (also hier die 5) mit im Ergebnis-Array des Splits mit aufgeführt wird.
Es erfolgt nun der Split zu Beginn des Strings. Das hat zur Folge das das erste Array-Element leer ist da vor der 5 nichts mehr kommt, du splittest hier ja und machst kein Match. Das Verhalten ist absolut normal.
Ich glaube du verwechselst hier vermutlich das Group-Matching mit dem Splitting.
Grüße Uwe
die Frage ist doch erst mal was willst du mit dem Regex eigentlich letztendlich erreichen?
Ein Regex ^(\d[A-Za-z]{0,10}) matcht ja eine einzelne Zahl gefolgt von 0 bis 10 Buchstaben.(p.s. das A-Z also die Erwähnung von Großbuchstaben ist hier nicht erforderlich da Regex in Powershell bei der Verwendung der Operatoren -split und -match per default case insensitive sind, das nur nebenbei bemerkt.)
Bei deinem String "5 Welten" wird hier also nur die 5 als alleiniger Splitter gematcht, da ja ein Leerzeichen folgt und kein Buchstabe. Das Setzen der Klammern bewirkt ja das der Splitter (also hier die 5) mit im Ergebnis-Array des Splits mit aufgeführt wird.
Es erfolgt nun der Split zu Beginn des Strings. Das hat zur Folge das das erste Array-Element leer ist da vor der 5 nichts mehr kommt, du splittest hier ja und machst kein Match. Das Verhalten ist absolut normal.
In anderen Sprachen (z.B. C++, C#) steht in Feld die 5 drin.
Nein, dort ist es genau gleich. Powershell benutzt das NET-Framework die Methoden dahinter sind also die gleichen aus dem .NET.Ich glaube du verwechselst hier vermutlich das Group-Matching mit dem Splitting.
Grüße Uwe
Hallo Dani
ggf. so:
@ PowerShell Profis, nicht hauen bitte. Dauert noch lange bis ich hier Laufen gelernt habe
Grüße
rubberman
ggf. so:
[string] $strTitle = "5 Welten Modell"
[array] $aResult = (([regex]"^\d+\s+\w{0,10}").Matches($strTitle) | %{$_.value}) -split "\s"
foreach($ele in $aResult) {
Write-Host "|$ele|"
}
@ PowerShell Profis, nicht hauen bitte. Dauert noch lange bis ich hier Laufen gelernt habe
Grüße
rubberman
Es soll die Zahl am Anfang und das erste Wort des Strings in ein Array geschrieben werden. Der Rest soll ignoriert werden.
Na dann
$strTitle = "5 Welten Modell"
[array]$aResult = [regex]::match($strTitle,"^(\d+)\s*(\w{0,10})").Groups[1..2].Value
$aResult
$strTitle = "5 Welten Modell"
if($strTitle -match "^(\d+)\s*(\w{0,10})"){
$matches[1..2]
}