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-Key: 314943

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

Printed on: April 20, 2024 at 03:04 o'clock

Mitglied: 129813
129813 Sep 10, 2016 updated at 21:29:06 (UTC)
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
Member: Kraemer
Solution Kraemer Sep 10, 2016 at 22:09:53 (UTC)
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
Member: colinardo
colinardo Sep 11, 2016 updated at 14:36:00 (UTC)
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
Member: Dani
Dani Sep 12, 2016 at 17:56:42 (UTC)
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
Member: rubberman
Solution rubberman Sep 12, 2016 at 18:35:54 (UTC)
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
Member: colinardo
Solution colinardo Sep 12, 2016 updated at 19:57:42 (UTC)
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
Member: Dani
Dani Sep 17, 2016 at 14:21:57 (UTC)
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