在PS 5.0中,我可以像这样在一行中分割和修剪字符串
$string = 'One, Two, Three'
$array = ($string.Split(',')).Trim()
但是在PS 2.0中失败了。我当然可以进行修整,以修剪每个项目,或者在进行拆分之前将', '
替换为','
,但是我想知道是否有更优雅的方法可以在所有版本的PowerShell中使用?
失败的话,替换似乎是用单个代码库解决所有版本的最佳方法。
答案 0 :(得分:3)
TheMadTechnician在对该问题的评论中提供了关键指针:
使用-split
operator ,其在PSv2中的工作原理相同:它期望使用正则表达式(regex)作为分隔符,从而可以进行更复杂的标记化而不是[string]
类型的.Split()
方法,后者对 literals 起作用:
PS> 'One, Two, Three' -split ',\s*' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
正则表达式,\s*
用逗号分隔输入字符串,后跟零个或多个(*
)空格字符(\s
)。
要完全等同于该问题中基于.Trim()
的解决方案,还需要修剪前导和尾随空白:
PS> ' One, Two,Three ' -split '\s+|,\s*' -ne '' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
\s+
匹配任何空白字符(1个或多个出现)的非空游程(+
),并且|
指定一个 alternation ,这样子表达式在任何一方都被视为比赛。
实际上,choosing -split
over .Split()
is advisable in general,甚至在更高的PowerShell版本中也是如此。
关于为什么('One, Two, Three'.Split(',')).Trim()
在PSv2中不起作用的原因:.Split()
方法返回令牌的 array 并在该数组上调用.Trim()
方法-与元素相反-PSv2不支持。
在PSv3 +中,.Trim()
方法调用被隐式“转发”到结果数组的 elements 中,从而实现了对各个标记的期望修整-此功能称为{{ 3}}。
答案 1 :(得分:2)
我没有PS 2.0,但您可以尝试类似
$string = 'One, Two, Three'
$array = ($string.Split(',') | % { $_.Trim() })
,看看是否适合。这可能对您没有多大帮助,但是对于已转移到将来版本的将来的读者,您可以使用#Requires
语句。请参阅help about_Requires
,以确定您的平台是否支持此功能。