爲什麼下面的結果是帶有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你是對的。我已經更新了我的答案,使其更通用。 –