如何在PowerShell中处理具有动态长度的子字符串

时间:2018-07-30 02:25:25

标签: powershell string-parsing

我有一个域列表,如下:

facebook.com  
youtube.com/video  
google.com/
github.com/something/somewhere
microsoft.com/default.aspx

现在,我想使用PowerShell对具有预期结果的子字符串进行如下操作,以创建干净的格式

facebook.com
youtube.com
google.com
github.com
microsoft.com

使用以下PowerShell,

ForEach($website in $list){
    $finalList  = $website.Substring(0,$website.IndexOf('/'))
    Write-Output $finalList 
}

此PowerShell的问题是,当循环在 facebook.co 上运行时,它抛出错误异常,调用带有“ 2”参数的“ Substring”:“长度不能为小于零。,因为 facebook.com 没有正斜杠(/),因此索引始终返回-1

我正在考虑一种排除facebook.com的方法,但似乎仍然找不到更好的方法。

1 个答案:

答案 0 :(得分:3)

尽管在PowerShell中直接使用.NET类型的方法 -例如.Substring()类型的[string]-始终是一种选择,但是PowerShell的本机功能通常会提供更多简洁优雅的解决方案:

# Create the list (an array of strings).
$list = @'
facebook.com  
youtube.com/video  
google.com/
github.com/something/somewhere
microsoft.com/default.aspx
'@ -split '\r?\n'

foreach ($website in $list) {
  # Split the list element by '/' (if present) and output the 1st token.
  ($website -split '/')[0]
}

以上结果:

facebook.com  
youtube.com
google.com
github.com
microsoft.com

-split operator返回基于RHS分隔符($website)的LHS(/)中包含的令牌数组,索引[0]返回第一个这样的令牌

如果LHS恰好不包含分隔符的实例,则返回一个单元素数组,仍然可以使用索引[0]安全地访问它。

如果URL列表中还包含端口号(例如website.com:8888),请按如下所示修改split命令:

($website -split '[/:]')[0]

这利用了以下事实:-split运算符支持正则表达式作为分隔符定义,并且字符集[/:]与(单个){{1} }和/