为什么下面的结果是带有7个元素的数组和5个空白?我只希望只有2个元素。 5个空白元素来自哪里?String.Split()的奇怪结果
$a = 'OU=RAH,OU=RAC'
$b = $a.Split('OU=')
$b.Count
$b
<#
Outputs:
7
RAH,
RAC
#>
为什么下面的结果是带有7个元素的数组和5个空白?我只希望只有2个元素。 5个空白元素来自哪里?String.Split()的奇怪结果
$a = 'OU=RAH,OU=RAC'
$b = $a.Split('OU=')
$b.Count
$b
<#
Outputs:
7
RAH,
RAC
#>
它为分隔符中的每个字符分割字符串。所以它把它分成'O','U'&'='。
由于@ mklement0评论过,我以前的答案在任何情况下都不起作用。所以这是获得预期项目的另一种方式。
$a.Split(',') |% { $_.Split('=') |? { $_ -ne 'OU' } }
该代码将首先拆分字符串,在,
然后每个项目将在=
被拆分并忽视了许多OU
,最终返回预期值的项目:
RAH
RAC
这会甚至工作在的情况下:
$a = 'OU=FOO,OU=RAH,OU=RAC'
产生3项FOO
,RAH
& RAC
要获得2只预期可以使用以下行字符串: $ a.Split( 'OU =',[System.StringSplitOptions] :: RemoveEmptyEntries) 哪位能给输出: RAH, RAC 如果您使用(注意分隔符中的逗号) $ a.Split(',OU =',[System。StringSplitOptions] :: RemoveEmptyEntries) 你会得到 RAH RAC
这可能是你想要的。 :)
没关系。刚刚意识到它在'O','U'和'='两边查找字符串。 因此,在第二个'O'和'U'之间的第一个'O'之间,'O'和'U'之间,'U'和'='之间,第二个' U'和'=')。
String.Split()是面向字符的。它分为O
,U
,=
三个不同的地方。
把它想象为打算用于1,2,3,4,5
。如果你有,2,3,4,
这意味着在开始和结束时会有空的空间。如果你有1,2,,,5
这意味着中间有两个空的空间。
PS C:\> $a = 'OU=RAH,OU=RAC'
PS C:\> $a.Split('RAH')
OU=
,OU=
C
的空间是R_A_H
和R_A
:
你可以像看。在字符串的末尾分割,它在开始/结束处引入空白。
PowerShell的-split
运算符是面向字符串的。
PS D:\t> $a = 'OU=RAH,OU=RAC'
PS D:\t> $a -split 'OU='
RAH,
RAC
你可能会更好地分割逗号,然后替换OU =,反之亦然,例如,
PS D:\t> $a = 'OU=RAH,OU=RAC'
PS D:\t> $a.Replace('OU=','').Split(',')
RAH
RAC
为了由(多字符)字符串和/或正则表达式,分割使用PowerShell的
-split
操作:
> ('OU=RAH,OU=RAC' -split ',?OU=') -ne '' # parentheses not strictly needed
RAH
RAC
-split
默认解释其RHS作为的正则表达式和,?OU=
与OU
本身和,OU
,导致所需的分割,将令牌作为数组返回。
-split
支持的所有功能,包括文字字符串匹配,限制令牌数退还,并使用脚本块,见Get-Help about_split
。由于输入开始用火柴,但是,考虑-split
分割的第一个元素是空字符串。通过将得到的令牌数组传递给-ne ''
,我们会过滤掉这些空字符串。
相比之下,使用的.NET String.Split()
method,因为你已经尽力了,作品非常不同:
'OU=RAH,OU=RAC'.Split('OU=')
OU=
是解释为字符数组,任何其中,单独充当分隔符 - 无论指定字符的顺序如何。领导,相邻,和尾部分离器是默认视为空标记分开,所以你得到的令牌的数组:
@('', '', '', 'RAH,', '', '', 'RAC')
如果仔细构造.Split()
方法调用,您可以指定字符串,但请注意,你仍然没有得到正则表达式支持:
> 'OU=RAH,OU=RAC'.split([string[]] 'OU=', 'RemoveEmptyEntries')
RAH,
RAC
的工作原理是文字字符串OU=
分割,删除空项,但你可以看到,这并不让你占了,
您可以通过指定的字符串数组进一步借此通过拆分,在这种简单的情况下工作,但最终不会给你同样的灵活性为PowerShell的-split
运营商提供的正则表达式:
> 'OU=RAH,OU=RAC'.split([string[]] ('OU=', ',OU='), 'RemoveEmptyEntries')
RAH
RAC
注意,指定(阵列)的字符串要求 - 方法调用的参数形式,这意味着您还必须指定System.StringSplitOptions
enumeration value。使用'None'
不适用任何选项(截至撰写本文时,唯一支持的真实选项是'RemoveEmptyEntries'
,如上所述)。
(类型安全的方式来指定选择是使用,例如,[System.StringSplitOptions]::None
,但是,通过选项名称为字符串是一个方便的快捷方式;例如,'None'
。)
@ mklement0你是对的。我已经更新了我的答案,使其更通用。 –