如何在Powershell中逐字符串拆分

21 powershell

我正在尝试用分隔符吐出字符串,这是一个字符串:

$string = "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0"
$separator = "<<>>"
$string.Split($separator)
Run Code Online (Sandbox Code Playgroud)

由于分裂,我得到:

5637144576, messag

est



5637145326, 1



5637145328, 0
Run Code Online (Sandbox Code Playgroud)

代替

5637144576, messag<>est
5637145326, 1
5637145328, 0
Run Code Online (Sandbox Code Playgroud)

当我尝试使用接受string []的重载split时:

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

但我得到下一个错误:

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.""
Run Code Online (Sandbox Code Playgroud)

有人知道如何按字符串拆分字符串吗?

Fro*_* F. 28

-split操作使用字符串分割的,而不是像chararray, Split():

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

5637144576, messag<>est
5637145326, 1
5637145328, 0
Run Code Online (Sandbox Code Playgroud)

如果要将该Split()方法与字符串一起使用,则需要使用$seperator带有一个元素的stringarray,并指定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
Run Code Online (Sandbox Code Playgroud)

编辑:正如@RomanKuzmin指出的那样,-split默认情况下使用正则表达式模式进行拆分.所以要注意逃避特殊字符(例如.,在正则表达式中是"任何字符").您还可以强制simplematch禁用正则表达式匹配,如:

$separator = "<<>>"
$string -split $separator, 0, "simplematch"
Run Code Online (Sandbox Code Playgroud)

了解更多关于-split 这里.

  • "-split运算符使用文字字符串进行拆分" - -split运算符默认使用正则表达式(不使用SimpleMatch选项).在这个例子中它并不重要,但一般来说它确实如此. (3认同)