一步分割和修剪

Gor*_*don 4 powershell text-parsing powershell-2.0

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

$string = 'One, Two, Three'
$array = ($string.Split(',')).Trim()
Run Code Online (Sandbox Code Playgroud)

但这在PS 2.0中失败了。我当然可以做一个foreach以调整每个项目,或更换', '','做分开过,但我不知道是否有一个更优雅的方式,在PowerShell中的所有版本的作品?失败的话,替换似乎是用单个代码库解决所有版本的最佳方法。

mkl*_*nt0 7

疯狂技术人员在对该问题的评论中提供了关键的指针:

使用-split 运算符,该运算符在PSv2中的工作原理相同:它期望使用正则表达式(regex)作为分隔符,从而允许比[string]类型的.Split() 方法更复杂的标记化,后者对文字进行操作:

PS> 'One, Two, Three' -split ',\s*' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
Run Code Online (Sandbox Code Playgroud)

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

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

PS> ' One,   Two,Three  ' -split '\s+|,\s*' -ne '' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
Run Code Online (Sandbox Code Playgroud)

\s+匹配任何+空白字符(1个或多个出现)的非空运行(),并|指定一个替换,以便将其任一侧的子表达式视为匹配项。

事实上,选择-split.Split()在一般的建议,甚至在以后的版本的PowerShell。


至于为什么('One, Two, Three'.Split(',')).Trim()在PSv2中不起作用:该.Split()方法返回一个令牌数组,并且.Trim()在PSv2中不支持在该数组上调用该方法(与其元素相对)。

在PSv3 +中,.Trim()方法调用被隐式“转发”到结果数组的元素,从而导致对单个标记的期望修整-此功能称为成员枚举


No *_*rns 5

我没有 PS 2.0,但你可以尝试类似的方法

$string = 'One, Two, Three'
$array = ($string.Split(',') | % { $_.Trim() })
Run Code Online (Sandbox Code Playgroud)

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