dani
Goto Top

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:
...
[string] $strTitle = "5 Welten"  
...
Nun splitte ich den String mit Hilfe eines Regulären Ausdrucks:
[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|
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

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

129813
129813 10.09.2016 aktualisiert um 23:29:06 Uhr
Goto Top
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
Kraemer
Lösung Kraemer 11.09.2016 um 00:09:53 Uhr
Goto Top
Hi,

deine Gruppierung ist nicht richtig.

'5 Welten' -match "(^\d*)\s?([A-Za-z]{0,10})"  
True

$matches

Name                           Value                                                                                 
----                           -----                                                                                 
2                              Welten                                                                                
1                              5                                                                                     
0                              5 Welten 

Gruß Krämer
colinardo
colinardo 11.09.2016 aktualisiert um 16:36:00 Uhr
Goto Top
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.
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
Dani
Dani 12.09.2016 um 19:56:42 Uhr
Goto Top
Guten Abend @ll.

@Kraemer
Sieht nicht schlecht aus... Danke dafür.

@colinardo
die Frage ist doch erst mal was willst du mit dem Regex eigentlich letztendlich erreichen?
Es soll die Zahl am Anfang und das erste Wort des Strings in ein Array geschrieben werden. Der Rest soll ignoriert werden. face-smile

(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.)
Die Zeichenkette wird aus einem Fremdsystem importiert. Da ich nicht ausschließen kann, dass im Wort ausversehen ein Großbuchstabe vorkommt, habe ich die Großbuchstaben berücksichtigt.

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.
Soweit konnte ich deine Erläuterung nachvollziehen. Sprich ich komm mit -split gar nicht ans Ziel sondern kommt über -matches ans Ziel?

Ich glaube du verwechselst hier vermutlich das Group-Matching mit dem Splitting.
Das ist im Rahmen des möglichen... ich bin zur Zeit etwas zerstreut. face-wink


Gruß,
Dani
rubberman
Lösung rubberman 12.09.2016 um 20:35:54 Uhr
Goto Top
Hallo Dani
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 face-wink

Grüße
rubberman
colinardo
Lösung colinardo 12.09.2016 aktualisiert um 21:57:42 Uhr
Goto Top
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
oder auch so mit der global verfügbaren Variable $matches deren Elemente immer die Submatches des letzten -match enthalten
$strTitle = "5 Welten Modell"  
if($strTitle -match "^(\d+)\s*(\w{0,10})"){  
    $matches[1..2]
}
VG
Dani
Dani 17.09.2016 um 16:21:57 Uhr
Goto Top
Moin Jungs,
entschuldigt die späte Rückmeldung. Leider war die Woche - mal wieder - turbolent.
Vielen Dank für eure Lösungen. Alle funktionieren wie sie sollen. Letztendlich finde ich die erste Variane von @colinardo am Schönsten.


Gruß,
Dani