在 PS 5.0 中,我可以在一行中分割和修剪字符串,就像这样
$string = 'One, Two, Three'
$array = ($string.Split(',')).Trim()
但这在 PS 2.0 中失败了。我当然可以在进行分割之前执行 foreach 来修剪每个项目,或者将
', '
替换为 ','
,但我想知道是否有一种更优雅的方法适用于所有版本的 PowerShell?
如果做不到这一点,替换似乎是使用单个代码库解决所有版本的最佳方法。
TheMadTechnician 在对该问题的评论中提供了关键指针:
使用
-split
运算符,其在PSv2中的工作方式相同:它需要一个正则表达式(正则表达式)作为分隔符,允许比[string]
类型的.Split()
方法更复杂的标记化,它对 literals: 进行操作
PS> 'One, Two, Three' -split ',\s*' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
Regex
,\s*
用逗号后跟零个或多个 (*
) 空白字符 (\s
) 分割输入字符串。
事实上,选择
-split
而不是 .Split()
一般而言是明智的,即使在更高版本的 PowerShell 中也是如此。
但是,为了完全等同于问题中基于
.Trim()
的解决方案,还需要修剪前导和尾随空格:
PS> ' One, Two,Three ' -split ',' -replace '^\s+|\s+$' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
-replace '^\s+|\s+$'
从拆分产生的每个标记中删除前导和尾随空格: |
指定一个 alternation,以便将其两侧的子表达式视为匹配; ^\s+,
匹配前导空格,\s+$
匹配尾随空格; \s+
表示一系列非空(一个或多个,+
)空白字符;有关 -replace
运算符的更多信息,请参阅 此答案。
在 PSv3+ 中,您可以简化为:
(' One, Two,Three ' -split ',').Trim()
或使用问题中显示的解决方案。
这两种解决方案都依赖于名为“成员访问枚举”的 v3+ 功能,如下所述。
要清除空/全空白元素,请附加 -ne ''
至于为什么
('One, Two, Three'.Split(',')).Trim()
.Split()
方法返回标记的
array,并且不支持在该数组上调用
.Trim()
方法(而不是其元素)在 PSv2 中。在 PSv3+ 中,
.Trim()
方法调用隐式“转发”到结果数组的elements,从而实现对各个标记的所需修剪 - 此功能称为
成员访问枚举
。我没有 PS 2.0,但你可以尝试类似的东西
$string = 'One, Two, Three'
$array = ($string.Split(',') | % { $_.Trim() })
#Requires
help about_Requires
确定您的平台是否支持此功能。
与@mkelement0 的
$strings = ' One, Two,Three ' -split ',|\s' -ne ''
# Proof of no whitespace:
$strings -notmatch '\s'
输出
One
Two
Three