一步分割和修剪

时间:2018-08-24 23:33:38

标签: powershell powershell-v2.0 text-parsing

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

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

但是在PS 2.0中失败了。我当然可以进行修整,以修剪每个项目,或者在进行拆分之前将', '替换为',',但是我想知道是否有更优雅的方法可以在所有版本的PowerShell中使用? 失败的话,替换似乎是用单个代码库解决所有版本的最佳方法。

2 个答案:

答案 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,以确定您的平台是否支持此功能。