2016-11-04 126 views
1

为什么下面的结果是带有7个元素的数组和5个空白?我只希望只有2个元素。 5个空白元素来自哪里?String.Split()的奇怪结果

$a = 'OU=RAH,OU=RAC' 

$b = $a.Split('OU=') 
$b.Count 
$b 

<# 

Outputs: 

7 



RAH, 


RAC 

#> 

回答

1

它为分隔符中的每个字符分割字符串。所以它把它分成'O','U'&'='。

由于@ mklement0评论过,我以前的答案在任何情况下都不起作用。所以这是获得预期项目的另一种方式。

$a.Split(',') |% { $_.Split('=') |? { $_ -ne 'OU' } } 

该代码将首先拆分字符串,在,然后每个项目将在=被拆分并忽视了许多OU,最终返回预期值的项目:

RAH 
RAC 

这会甚至工作在的情况下:

$a = 'OU=FOO,OU=RAH,OU=RAC' 

产生3项FOORAH & RAC

要获得2只预期可以使用以下行字符串: $ a.Split( 'OU =',[System.StringSplitOptions] :: RemoveEmptyEntries) 哪位能给输出: RAH, RAC 如果您使用(注意分隔符中的逗号) $ a.Split(',OU =',[System。StringSplitOptions] :: RemoveEmptyEntries) 你会得到 RAH RAC

这可能是你想要的。 :)

+1

@ mklement0你是对的。我已经更新了我的答案,使其更通用。 –

0

没关系。刚刚意识到它在'O','U'和'='两边查找字符串。 因此,在第二个'O'和'U'之间的第一个'O'之间,'O'和'U'之间,'U'和'='之间,第二个' U'和'=')。

0

String.Split()是面向字符的。它分为OU,=三个不同的地方。

把它想象为打算用于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_HR_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 
2

为了由(多字符)字符串和/或正则表达式,分割使用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'。)