一步分割&Trim

Split & Trim in a single step

在 PS 5.0 中,我可以在一行中拆分和 trim 一个字符串,就像这样

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

但这在 PS 2.0 中失败了。我当然可以对每个项目执行一个 foreach trim,或者在拆分之前将 ', ' 替换为 ',',但我想知道是否有更优雅的方法适用于所有版本电源外壳? 如果做不到这一点,替换似乎是使用单一代码库解决所有版本的最佳方法。

我没有 PS 2.0,但您可以试试

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

看看是否合适。这对您的帮助可能不大,但对于已转向未来版本的未来读者,您可以使用 #Requires 语句。请参阅 help about_Requires 以确定您的平台是否支持此功能。

TheMadTechnician 在对问题的评论中提供了关键指针:

使用 -split 运算符,它在 PSv2 中的作用相同:它需要一个 正则表达式 (regex) 作为分隔符,允许比 [string] 类型的 .Split() 方法 更复杂的标记化,它在 文字 上运行:

PS> 'One, Two, Three' -split ',\s*' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]

正则表达式 ,\s* 通过逗号后跟零个或多个 (*) 个空白字符 (\s).

来拆分输入字符串

事实上,,即使在更高版本的 PowerShell 中也是如此。


但是,要完全等同于问题中基于 .Trim() 的解决方案,还需要修剪前导和尾随空格:

PS> ' One,   Two,Three  ' -split ',' -replace '^\s+|\s+$' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]

-replace '^\s+|\s+$' 从拆分产生的每个标记中删除前导和尾随空格:| 指定一个 交替 以便它被认为是一场比赛; ^\s+, 匹配前导空格,\s+$ 匹配尾随空格; \s+表示一个非空(一个或多个,+)运行的空白字符;有关 -replace 运算符的详细信息,请参阅

(在 PSv3+ 中,您可以简化为 (' One, Two,Three ' -split ',').Trim() 或使用问题的解决方案。)


至于为什么 ('One, Two, Three'.Split(',')).Trim() 在 PSv2 中不起作用: .Split() 方法 returns 一个 array 的标记,并调用.Trim() PSv2 不支持该数组(与其元素相反)上的方法。

在 PSv3+ 中,.Trim() 方法调用被隐式地“转发”到结果数组的 元素 ,导致对单个标记进行所需的修整 - 这功能称为 member-access enumeration.