在PowerShell中对字符串使用.Split()运算符并尝试使用一个以上字符的字符串进行拆分时,PowerShell表现出奇怪的行为-它使用字符串中的 any 个字符分裂。
例如:
PS C:\Users\username> "One two three keyword four five".Split("keyword")
On
t
th
f
u
fiv
我不了解您,但是我期望结果是一个像这样的数组:
@("One two three "," four five")
如何分割字符串,将“分割符”视为文字字符串?对于那些来自VBScript的用户,这就是内置的Split()函数在VBScript中的行为。
其他一些注意事项:
答案 0 :(得分:3)
-split运算符期望使用RegEx,但是可以做到这一点。但是,-split运算符仅在Windows PowerShell v3 +上可用,因此不符合问题中的要求。
[regex]对象具有一个Split()方法也可以处理此问题,但是它希望RegEx作为“分隔符”。为了解决这个问题,我们可以使用第二个[regex]对象并调用Escape()方法,将文字字符串“ splitter”转换为转义的RegEx。
将所有这些包装到一个易于使用的功能中,该功能可以回溯到PowerShell v1,也可以在PowerShell Core v6上工作。
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 "One two three keyword four five" "keyword"
One two three
four five
Volla!
答案 1 :(得分:1)
无需创建函数。
您可以通过两种不同的方式使用split
函数。如果您使用:
"One two three keyword four five".Split("keyword")
括号内的每个单个字符都用作分隔符。但是,如果您改为使用:
"One two three keyword four five" -Split ("keyword")
字符串“ keyword”用作分隔符。