2013-05-08 14 views
11

Ich versuche, die Zeichenfolge mit Trennzeichen zu spucken, die eine Zeichenfolge ist:Wie aufzuspalten String anhand einer Zeichenkette in Powershell

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = "<<>>" 
$string.Split($separator) 

Als Ergebnis der Spaltung ich:

5637144576, messag 

est 



5637145326, 1 



5637145328, 0 

statt

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

Wenn ich versuche, überlastet Split zu verwenden, die Zeichenfolge akzeptiert []:

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = @("<<>>") 
$string.Split($separator) 

Aber ich nächsten Fehler:

Cannot convert argument "0", with value: "System.Object[]", for "Split" to type "System.Char[]": "Cannot convert value "<<>>" to type "System.Char". Error: "String must be exactly one character long."" 

Hat jemand weiß, wie man durch string aufgeteilt?

+0

Warum sollte sich das Trennzeichen '<<>>' '' entlang '<>' teilen? –

+0

Warum sollte das Trennzeichen <<>> geteilt werden <>? - Dies ist ein Problem, das ich konfrontiert und versuchen zu lösen – Ievgen

+0

ist es, dass Sie entlang _joy_ of__ <<>> 'teilen möchten? –

Antwort

15

Der -split Operator verwendet die Zeichenfolge aufzuteilen, anstelle eines chararray wie Split():

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = "<<>>" 
$string -split $separator 

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

Wenn Sie die Split() Methode mit einem String verwenden möchten, müssen Sie die $seperator ein string mit einem Element sein , und geben Sie außerdem einen stringsplitoptions-Wert an. Sie können ihre Definition sehen dies durch Überprüfung:

$string.Split 

OverloadDefinitions                     
-------------------                     
string[] Split(Params char[] separator)                
string[] Split(char[] separator, int count)               
string[] Split(char[] separator, System.StringSplitOptions options)         
string[] Split(char[] separator, int count, System.StringSplitOptions options)      

#This one 
string[] Split(string[] separator, System.StringSplitOptions options)  
string[] Split(string[] separator, int count, System.StringSplitOptions options) 


$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" 
$separator = [string[]]@("<<>>") 
$string.Split($separator, [System.StringSplitOptions]::RemoveEmptyEntries) 

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 

EDIT: Wie @RomanKuzmin wies darauf hin, -split Splits mit regex-Muster standardmäßig. Achten Sie also darauf, Sonderzeichen zu vermeiden (zB ., die in Regex "irgendein Zeichen" ist). Sie könnten auch simplematch zwingen regex Anpassungs wie zu deaktivieren:

$separator = "<<>>" 
$string -split $separator, 0, "simplematch" 

Lesen Sie mehr über -splithere.

+0

'est' sollte beibehalten werden.Er scheint sich durch jedes Zeichen von '>' teilen zu wollen (das heißt, entlang '<' and '>') –

+0

sry, sah nicht est in der Probe der Ausgabe, die du wolltest ^^ siehe aktualisierte Antwort –

+0

weißt du, ist möglich, nur nicht leere Zeichenfolge zurückzugeben? – Ievgen

1

Instaed der Verwendung von Split Methode, können Sie split Operator verwenden. So Ihr Code wie folgt sein:

$string -split '<<>>' 
0

Die folgende Beschreibung ist, was Sie brauchen:

$string -Split $separator 

Dies erzeugt:

5637144576, messag<>est 
5637145326, 1 
5637145328, 0 
0

Manchmal Powershell sieht genauso aus wie C# und bei anderen, Nun, Sie wissen ...

Es könnte auch so verwendet werden:

# A dummy text file 
$text = @' 
abc=3135066977,8701416400 

def=8763026853,6433607660 

xyz=3135066977,9878763344 
'@ -split [Environment]::NewLine,[StringSplitOptions]"RemoveEmptyEntries" 

"`nBefore `n------`n" 

$text 

"`nAfter `n-----`n" 

# Do whatever with this 
foreach ($line in $text) 
{ 
    $line.Replace("3135066977","6660985845") 
} 
Verwandte Themen