2016-11-04 59 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'。)