2016-04-26 11 views

Antwort

5

Sie eine einfache regex verwenden könnte (demo) zwei Zeichen übereinstimmen und ersetzen Sie es mit dem ersten:

$s -replace '(.).', '$1' 

Ausgabe:

ace 

Wenn Sie Zeichen haben wollen, werfen sie einfach auf ein char[]:

[char[]] ($s -replace '(.).', '$1') 

oder geteilt die Zeichenfolge (dank PetSerAl):

$s -replace '(.).', '$1' -split '(?!^|$)' 
+0

hier schließlich uR nur einen String bilden. Was, wenn wir Charaktere abrufen wollen? – Madhusudan

+0

Ich habe meine Antwort aktualisiert, wie Sie Zeichen abrufen können. Ich habe auch eine Regex-Demo hinzugefügt. Grundsätzlich fange ich das erste Zeichen und ersetze die ersten beiden Zeichen durch das eingefangene. –

+2

'-split ''' -> '-split '(?!^| $)'' Um nicht zwei leere Zeichenfolgen zu erzeugen. – PetSerAl

2

nicht sicher, ob es einfacher, aber es ist anders:

$s = "abcdef" 
for ($i = 0; $i -lt $s.Length; $i++) 
{ 
    if ($i % 2 -ne 0) 
    { 
     $s[$i] 
    } 
} 
3

Love the regex Antwort aber wollte etwas beinhalten, dass die Pipeline mehr und Select-Object

$string = "abcdef" 
[char[]]$string | Select-Object -Index (0..($string.Length-1) | Where-Object{$_ % 2}) 

-Index nimmt die Länge der Saite und retu verwendet rns und ein Array von ungeraden Zahlen, die zum Extrahieren der Zeichen aus dem char-Array verwendet werden. Unter Verwendung von !($_ % 2) würde die zurückgegebene Menge alternieren. In beiden Fällen nutze ich den Wert des Modulusoperators. Wenn die Zahl gerade ist, wird im obigen Beispiel 0 zurückgegeben, was zu false führt. $_ % 2 -eq $false würde das gleiche erreichen und besser lesbar sein.

+0

Schöne Lösung .... Einen weiteren Weg gefunden. Vielen Dank :) – Madhusudan

+0

Nice Matt. Ich habe auch versucht, dies zu lösen, indem ich Pipeline- und Array-Arithmetik benutzte, aber ich blieb stecken (ich vermisste Where-Object). –

3

Eine andere Möglichkeit:

$string = 'abcdefg' 
$i=0 
([char[]]$string).where({$i++ %2}) 
b 
d 
f 
+0

++; Hinweis für zukünftige Leser: Diese _method_-Syntax - eine schnellere und flexiblere Alternative zum 'Where-Object' _cmdlet_ - erfordert PSv4 +. Sie können mehr [hier] lesen (http://www.powershellmagazine.com/2014/10/22/foreach-and-where-magic-methods/). – mklement0

+0

Ein weiterer Weg ... Danke @ mklement0 :) – Madhusudan

+0

@Rushikesh: Danke, aber Kredit geht an den Autor dieser Antwort, mjolinor - ich habe nur _supplemental_ Informationen zur Verfügung gestellt. – mklement0