Как разбить строку по строке в Powershell

Я пытаюсь выплюнуть строку с разделителем, который является строкой:

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

В результате расщепления я получаю:

5637144576, messag

est



5637145326, 1



5637145328, 0

Вместо

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

Когда я пытаюсь использовать перегруженный split, который принимает строку []:

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

Но я получаю следующую ошибку:

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.""

Кто-нибудь знает, как разделить строку по строке?

Ответ 1

Оператор -split использует строку для разделения, вместо chararray like Split():

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

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

Если вы хотите использовать метод Split() со строкой, вам нужно, чтобы $seperator был строковым символом с одним элементом, а также указывал значение stringsplitoptions. Вы можете увидеть это, проверив его определение:

$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: Как отметил @RomanKuzmin, -split по умолчанию использует шаблоны regex. Поэтому имейте в виду избежать специальных символов (например, ., которые в регулярном выражении являются "любым символом" ). Вы также можете заставить simplematch отключить регулярное выражение, например:

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

Подробнее о -split здесь.

Ответ 2

При использовании метода Split вы можете использовать оператор Split. Таким образом, ваш код будет выглядеть следующим образом:

$string -split '<<>>'

Ответ 3

Ниже следует то, что вам нужно:

 $string -Split $separator

Это дает:

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

Ответ 4

Иногда PowerShell выглядит точно так же, как на С#, а у других, хорошо знаете...

Его также можно использовать таким образом:

# 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")
}