一步分割&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.
在 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
).
事实上,
但是,要完全等同于问题中基于 .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.