【问题标题】:Split & Trim in a single step一步完成拆分和修剪
【发布时间】:2019-01-31 10:17:57
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以使用 RegEx 版本的 split 像 $array = $string -split ', *' 来删除逗号后面的任何空格。

标签: powershell powershell-2.0 text-parsing


【解决方案1】:

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

使用-split 运算符,它在 PSv2 中的工作方式相同:它需要一个 正则表达式(正则表达式)作为分隔符,允许比[string] 类型的.Split() 方法,对文字进行操作:

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

正则表达式 ,\s* 用逗号分隔输入字符串,后跟零个或多个 (*) 空白字符 (\s)。

事实上,choosing -split over .Split() is advisable in general,甚至在更高版本的 PowerShell 中。


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

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

-replace '^\s+|\s+$' 从拆分产生的每个标记中删除前导和尾随空格:| 指定 alternation 以便将其两侧的子表达式视为匹配; ^\s+, 匹配前导空格,\s+$ 匹配尾随空格; \s+ 表示非空(一个或多个,+)空格字符;有关-replace 运算符的更多信息,请参阅this answer

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


至于为什么('One, Two, Three'.Split(',')).Trim() 在 PSv2 中不起作用:.Split() 方法返回一个 array 标记,并在该数组上调用 .Trim() 方法 - 而不是它的元素- PSv2 不支持。

在 PSv3+ 中,.Trim() 方法调用被隐式“转发”到结果数组的 元素,从而实现对单个标记的所需修剪 - 此功能称为 member enumeration

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • +1 用于问题中代码的正确 to-v2 转换,但请注意,Gordon 专门寻找更优雅的解决方案(“我当然可以做一个 foreach 来修剪每个项目 [ ...]")。
    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2015-05-13
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多