27

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

$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

当我尝试使用接受字符串 [] 的重载拆分时:

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

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

4

5 回答 5

38

-split运算符使用字符串进行拆分,而不是像这样的字符数组Split()

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

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

如果要对Split()字符串使用该方法,则需要将$seperator其作为一个元素的字符串数组,并指定一个字符串拆分选项值。您可以通过检查其定义来看到这一点:

$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

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

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

阅读更多关于-split 这里

于 2013-05-08T07:55:21.257 回答
1

有时 PowerShell 看起来与 C# 完全一样,而在其他情况下,你知道......

它也可以这样使用:

# 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")
}
于 2014-07-26T05:14:21.303 回答
1

代替使用Split方法,您可以使用split运算符。所以你的代码将是这样的:

$string -split '<<>>'
于 2013-05-08T07:58:33.960 回答
1

编辑 2020-05-23:我已将代码移至 GitHub,在这里,我进行了更新以涵盖一些边缘情况:https ://github.com/franklesniak/PowerShell_Resources/blob/master/Split-StringOnLiteralString .ps1


您可以使用 -split 运算符,但它需要 RegEx。此外,-split 运算符仅在 Windows PowerShell v3+ 上可用,因此如果您想要与所有版本的 PowerShell 普遍兼容的东西,我们需要一种不同的方法。

[regex] 对象有一个 Split() 方法也可以处理这个问题,但同样,它希望 RegEx 作为“拆分器”。为了解决这个问题,我们可以使用第二个 [regex] 对象并调用 Escape() 方法将我们的文字字符串“splitter”转换为转义的 RegEx。

将所有这些封装到一个易于使用的函数中,该函数可以回溯到 PowerShell v1,也可以在 PowerShell Core 6.x 上运行。

function Split-StringOnLiteralString
{
    trap
    {
        Write-Error "An error occurred using the Split-StringOnLiteralString function. This was most likely caused by the arguments supplied not being strings"
    }

    if ($args.Length -ne 2) `
    {
        Write-Error "Split-StringOnLiteralString was called without supplying two arguments. The first argument should be the string to be split, and the second should be the string or character on which to split the string."
    } `
    else `
    {
        if (($args[0]).GetType().Name -ne "String") `
        {
            Write-Warning "The first argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString."
            $strToSplit = [string]$args[0]
        } `
        else `
        {
            $strToSplit = $args[0]
        }

        if ((($args[1]).GetType().Name -ne "String") -and (($args[1]).GetType().Name -ne "Char")) `
        {
            Write-Warning "The second argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString."
            $strSplitter = [string]$args[1]
        } `
        elseif (($args[1]).GetType().Name -eq "Char") `
        {
            $strSplitter = [string]$args[1]
        } `
        else `
        {
            $strSplitter = $args[1]
        }

        $strSplitterInRegEx = [regex]::Escape($strSplitter)

        [regex]::Split($strToSplit, $strSplitterInRegEx)
    }
}

现在,使用前面的示例:

PS C:\Users\username> Split-StringOnLiteralString "5637144576, messag<>est<<>>5637145326, 1<<>>5637145328, 0" "<<>>"
5637144576, messag<>est
5637145326, 1
5637145328, 0

沃拉!

于 2019-12-30T04:17:28.450 回答
0

以下应该是您需要的:

 $string -Split $separator

这会产生:

5637144576, messag<>est
5637145326, 1
5637145328, 0
于 2013-05-08T08:01:24.327 回答