一步分割和修剪

问题描述 投票:0回答:3

在 PS 5.0 中,我可以在一行中分割和修剪字符串,就像这样

$string = 'One, Two, Three'
$array = ($string.Split(',')).Trim()

但这在 PS 2.0 中失败了。我当然可以在进行分割之前执行 foreach 来修剪每个项目,或者将

', '
替换为
','
,但我想知道是否有一种更优雅的方法适用于所有版本的 PowerShell? 如果做不到这一点,替换似乎是使用单个代码库解决所有版本的最佳方法。

powershell powershell-2.0 text-parsing
3个回答
21
投票

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()
在 PSv2 中不起作用:

.Split() 方法返回标记的

array
,并且不支持在该数组上调用 .Trim()
 方法(而不是其元素)在 PSv2 中。
在 PSv3+ 中,.Trim()
 方法调用隐式“转发”到结果数组的 
elements

,从而实现对各个标记的所需修剪 - 此功能称为

成员访问枚举

我没有 PS 2.0,但你可以尝试类似的东西

$string = 'One, Two, Three' $array = ($string.Split(',') | % { $_.Trim() })

5
投票
看看是否适合。这对您来说可能帮助不大,但对于已经转向未来版本的未来读者,您可以使用

#Requires

语句。请参阅
help about_Requires
确定您的平台是否支持此功能。


@mkelement0


0
投票
类似,由于比较运算符处理集合的方式,您还可以使用另一个方便的技巧:

$strings = ' One, Two,Three ' -split ',|\s' -ne '' # Proof of no whitespace: $strings -notmatch '\s' 输出

One
Two
Three

© www.soinside.com 2019 - 2024. All rights reserved.